LeetCode 刷题记录 002:两数相加

小明君 - MING

读完需要

12

分钟

速读仅需 10 分钟

.题目

.准备知识

第一眼看到这个题目,小明真的懵逼了。不怕大家笑话,小明不是CS科班出身,没有尝过数据结构和算法这些个基础课程。关于我的个人背景,在「

每周思考|学习什么样的知识才能获益终生?

」里有提到,感兴趣的同学,可以看一下。

但是小明并不怕,现学现用,一直是小明很喜欢干的事。不能总是准备好了再出发,等你花尽心机用了几个月时间去学完了数据结构和算法,却早已精疲力尽,忘记了初衷。

为了完成这道题,我立马上网,搜寻了 的相关知识。

网上的理论内容很多,要深入理解的可以使用搜索引擎捞一下。

在这里不会讲那么细。

一是、讲得太细,要讲好多,篇幅必将拉得很长。

二是、讲得太多,你还不一定能懂得这是啥。

所以,我也在想到底怎么样才能用一句话或者一张图就把这件事说清楚。

一句话:,用拆词法来看,是由一条链(链由多个节点连接组成)来表示一个列表的对象。

每个节点,我们称之为 ,该有两个属性,一个是val,存放当前节点的值,一个是next,存放下一个节点的地址。

一张图

如下图,就是嵌套存储下节点的值,每个当前节点的next,都是下一节点对象。

.我的版本

运行一下,还算理想。击败了,今天又可以加个鸡腿了。

在上面我的代码中有这么一段,是做什么的。

我的第一遍代码是没有这段的,测试数据也通过,但在提交答案的时候,在大量测试用例下,有一个场景没有考虑到,就是两数的最高位,相加进一的时候就会出错。比如下面这种。

.网上的版本

按照惯例,还是上网去看看别人的优秀代码。结果,真的让小明大吃一惊,和我一样的逻辑,但是代码可对我精练多了。大家可以对比学习一下。

.难点梳理

在以上代码中,有一个新手可能难以理解的是,下面这个用法。

通常来说,Python 中的 很多人可能会理解为 ,在大多数情况,赋值确实很通俗易懂,但是在如上这种情况下,如果你再用 去理解,你可以发现,怎么都解释不通。

所以这里,小明认为, 准确的理解 应该是 。

第一句

首先在内存中取得一席之地(内存地址),存放其值。

然后,创建一个变量名为的对象,并将其指向的地址。

最后,再创建一个变量名为的对象,也将其指向的地址。

这样,header和n就都是Node(2)的代言人,对header和n中的任一变量做改变,另一变量也将随之变化,因为他们两个本就是一个对象。和下面代码这种是一样的,你一定知道其中原理。

第二句

首先在内存中取得一席之地(内存地址),存放其值。

然后,将之前的变量的next属性,指向的地址。本质上是改变了的next 指向的是

最后,将变量n重新指定,这时候,就相当于。

这样一来,就实现了一层嵌套,增加了一个节点。说起来有点绕。但请一定要理解这个的思想。

.欢迎加入

虽然是小小的一道题,但是解法却是各种这样。每一种解法都充满了思考与智慧。

如果你对此感兴趣,想和我一起刷题的,一起进步的呢。

正好,我在这里建了一个群,定位是。我们可以一起在里面讨论Python的方方面面。

.组织形式

每周两道或三道吧,时间比较弹性,但基本节奏会是这样的。

【第一题】

周日晚上,发题。

周一至周三,三天的时间可以做题。

【第二题】

周三晚上,发题。

周四周五,两天的时间可以做题。

【第三题】

周五晚上,发题。

周末两天都可以做题。

做完了,可以截图在群里,让大家看看你的代码,但最好也可以发下文件。方便我这边记录。

发题形式,我会在LeetCode官网上截出题目,放置在公号后,回复【作业】即查看最新题目,但这只是为了方便在手机查看。

所以强烈建议,自己能去LeetCode注册个帐号查看。

1、因为有了帐号,才能检测自己的代码能不能通过。

2、这样你的帐号就有做题的记录。等你做完了,也会有满满的成就感。

为什么不是每天一道题?

因为工作党有工作,学生党最近可能也要考试吧。很有可能抽不出时间来。

在提交作业后,我会整理大家的答案,展示在公众平台上。(虽然没什么用哈哈)。

另外,如果你对以上代码有任何建议或质疑,请一定要在后台告诉我,或者加入我的微信群。谢谢,期待你的加入。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180606G21LZW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券