Leetcode Tencent 50 Task 31 2. Add Two Numbers
描述
给出两个非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
1 | 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) |
来源:力扣(LeetCode)
链接:2. Add Two Numbers
解题思路
看到链表的题目通常会想到做两件事情,首先是链表的遍历,然后是新建一个链表头节点。
本题的思路也是如此,就是新建一个链表,然后从头遍历两个输入的链表,每两个数相加,根据相加的结果,添加一个新节点到新链表的 后面。为了避免两个输入链表同时为空,我们新建一个result空节点,然后将两个节点相加生成的新节点按顺序加到result节点之后,由于result节点本身是需要最后指向返回链表的头节点的,因此本身不能改变,为了后续的操作,我们再用一个current指针指向result链表的最后一个节点。
数据结构准备完毕就可以进行算法的设计和操作了。
首先让两个链表相加,这题的最低位在链表的开头,一下子让难度降低不少,这样我们在遍历链表的同时可以按从低到高的顺序直接相加。while循环的条件是两个链表中只要有一个不为空或者carry有进位就需要继续遍历下去。考虑到链表可能为空,所以在取当前节点值的时候需要判断下链表是否为空,为空则取0,不为空则取节点值。
然后把两个节点值相加,同时还要考虑加上进位carry,carry的可能取值为0或者1。然后用sum/10更新进位carry。然后以sum%10为值建立一个新的节点,连接到current后面,再将current移动到下一个节点,即让current指针永远指向result链表的最后一个节点。
然后更新两个节点,其实就是两个节点如果不为空,则将指针后移一位,这是遍历链表的常规操作。
while循环退出以后,最高位是否有进位这一需要特殊处理的情况也已经在循环当中处理,直接返回result即可。具体代码如下:
代码
1 | /** |