Leetcode 0002 Add Two Numbers

题目:给你两个非空的链表(linked lists),表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。


这道题可是困扰了我快一天的时间。刚入手,对leetcode的一些基本认识不够。后来才知道,即便是leetcode的playground给出特别全的代码,也没法直接拿过来在pycharm或者jupyter上运行,leetcode里好多代码都没显示出来。所以要提交的内容只是包括了两个listnode的加法,至于怎么将一组list或者string转化成链表,以及将链表打印出来,这些过程则不在要提交的内容里。不过我在这写东西,不是作为要提交到leetcode上的标准答案来写,所以,我打算从头到尾模拟一下,如何将输入的string或者list转化成链表,怎样对链表按照题目要求进行计算,以及最后如何将链表打印出来。


什么是链表,可以直接看数据结构--链表,所以对链表的介绍直接跳过。根据题目要求,任意输入一个数,然后将输入数的每位数字逆序存储在链表的node中,每个node只储存一位数,也就是0-9中的一个,所以要先定义链表里的node,然后将输入的值转化为node中存储的值。linked lists里的node是一个类,对node的定义如下:

Figure 2-1

通过定义可以看出,每个node由两个部分组成:元素+指针,也就是value和next。

接下来,我们定义如何将输入的数存储到linked lists的node里。我们假设输入的数已经转化成list了,那么接下来就是将list转化成linked lists的形式,如果输入的数是其他形式,比如string,则再额外加一步转化成list即可。下面是将list转化为linked lists的函数:


Figure 2-2

这样,list里的每一位数都储存在link lists里了,增加的linked lists的长度就是list的长度。这里dummy root是构造linked lists常用的一种形式,将dummy root作为一个参照,每次指向下一个node从而按要求构造好linked lists, 而dummy node就相当于构造的链表的头结点。

在转化为linked lists之后,接下来就是运算步骤,即,将两个数相加得到新的数这一过程。我将leetcode上一位答主的回答搬过来了,写的真简洁,佩服!


Figure 2-3

运算是对每个node进行的,举个例子,我们要算98+998,那linked lists应该存储为 8 \rightarrow 98 \rightarrow 9 \rightarrow 9。运算就是先算8+8,得6进1,然后再算9+9+1,得9进1,再1+9得0进1,所以最后的结果为6 \rightarrow 9 \rightarrow 0 \rightarrow 1,也是一个linked lists。

这一运算过程,首先需要一个新的linked lists来储存运算结果,记为p,同时也需要一个s来判断是否有进位1,如果有,则需在下一位的运算中加上1,没有则加0。接下来则是每一位的计算,如果某一linked lists被遍历完了,则在接下来的遍历过程,该linked lists的元素参与加法的位置一直是None,比如在上面那个例子,98所在的linked lists先被遍历完,那在第三位数的运算中,就成了0(None)+9+1。(l1.val if l1 else 0)这一句的意思是,如果l1被遍历完了,则在计算中此位置取0,否则取l1当前值。终止条件为l1和l2都被遍历完,同时s为0,最后再返回到p的第一个node。

到这步,其实任务已经完成了,输出的就是储存了运算结果的linked lists,但是为了可视化,我接下来再进行一步print的过程。


Figure 2-4

在将linked lists打印出来的过程中,我这里是直接转化成list了,如果输入的linked lists是空的,打印成0,如果不是空的,则按照linked lists每个node的值,相应地打印到list里,这样就实现了打印过程。


额外补充一下,如果希望输入和输出是string的形式,应该怎么办。在输入的时候,将string转化成list即可,需要用到json包。不能直接用list函数,否则会连逗号以及括号都打印出来,几个运行结果如下:

Figure 2-5


再就是将linked list输出为string,这里只需将函数listNodeTolist()改成listNodeToString()即可。


Figure 2-6


之前忘了,98+998的运行结果:


Figure 2-7
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容