题目描述:给出两个 非空链表 来表示两个非负整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储一位数字。如果将这两个数加起来,则会返回一个新的 链表 来表示它们的和。可以假设除了数字 0 以外,这两个数不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 0 -> 8
原因: 342 + 465 = 807
先给出代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumber(self, l1, l2):
result = ListNode(True)
res = result
carry = 0
while l1 or l2:
if l1:
x = l1.val
else:
x = 0
if l2:
y = l2.val
else:
y = 0
summ = carry + x + y
carry = summ // 10
num = summ % 10
res.next = ListNode(num)
res = res.next
if l1:
l1 = l1.next
if l2:
l2 = l2.next
if carry != 0:
res.next = ListNode(1)
return result.next
其实本身这题并不难,但是我觉得这题对于使用 Python 写链表的题是个比较好的示例。链表结构隐含在节点的属性里 next 里,如果当前节点有下一节点,则其 next 属性就指向下一个节点,这时 next 就是下一节点的引用。
首先构建用于输出的结果链表,我这里是用了一个 True 当做 header 占位,当然也可以用 0 之类的,然后就是循环获得 l1、l2 的节点值,carry 用来进位,每增加一个节点,记得把 res 重新指向最后一个节点。
考虑边界情况,就是加法结果的最高位溢出的情况,如果这种情况发生,就再给结果链表增加一个值为 1 的节点。
最后要注意的就是返回应该是结果链表去掉 header 的剩余部分,即 result. next 。