给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
class Solution:
def addTwoNumbers(self, l1, l2):
res_sum = []
add_ = 0
flag1 = 1
flag2 = 1
while (True):
l1_val = l1.val
l2_val = l2.val
sum = l1_val + l2_val + add_
add_ = 0
if (sum < 10):
res_sum.append(sum)
if (l1.next==None and l2.next==None):
break
else:
add_ = int(sum / 10)
res_sum.append(sum % 10)
if (flag1==0 and flag2==0):
res_sum.append(add_)
break
if (l1.next == None):
flag1 = 0
l1.next = ListNode()
if (l2.next == None):
flag2 = 0
l2.next = ListNode()
l1 = l1.next
l2 = l2.next
# 得到了list结果,进行转换
res = ListNode(res_sum[-1])
for i in reversed(res_sum[0:-1]):
res = ListNode(i, res)
return res
心路历程:
- 一开始题目都没看懂o(╥﹏╥)o 看了半天,才明白这相当于从左往右的加法。
- 然后打开pycharm,构建满足题目要求的ListNode l 1 l1 l1和 l 2 l2 l2,这一步也搞了半天。
- 一开始的思路是,从左往右一个一个加嘛,然后用add_存溢出的数。但是题目要求返回的值也要是链表,这就难倒我了。
- 链表实在是太讨厌了,不能用sum = 0 sum = sum+i这种操作,因为它有value和next两个属性,这样赋值的话,会造成 cycle 的问题。想了半天没想出来怎么解决,最后决定用list存储结果,最后再转成链表。
- 然后又发现问题,就是不知道循环多少次,因为链表既没有sizeof()又没有len(),只能通过next属性。两个链表长度还不一样,于是弄了一个flag记录是不是到了最后一个节点,当flag都等于0时就停下来。
- 加到最后还有进位时,也很麻烦。我的解决办法是,判断sum>10时,再判断一下是不是到了结尾。不过这样做蠢蠢的。
- 提交的时候又发现了新问题o(╥﹏╥)o 当输入为[0][0]时出问题。因为我在代码中用到了l1=l1.next() l1.next相当于寻找了两次next。啊啊啊,脑壳痛。于是交换了位置,不过还是有问题。
- 做了三个半小时,终于做出来了~
第二天看了看参考答案,发现参考答案的思路跟我是一样的,也是从左往右加,记录下进位carry,并且整体流程也差不多(^ ^)。
不过除了循环的方式,我还看见了递归的解法,C++实现的
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
dummy = curr = ListNode()
carry = 0
while l1 or l2:
x = l1.val if l1 else 0
y = l2.val if l2 else 0
total = x + y + carry
curr.next = ListNode(total % 10)
curr = curr.next
carry = total // 10
if l1: l1 = l1.next
if l2: l2 = l2.next
if carry: curr.next = ListNode(carry)
return dummy.next
- 一开始取值的时候,就判断了l1和l2的状态。
- 移动的时候也要先检查l1是不是none,再移动。
- 每次sum都要计算一次carry,最后也要检查carry状态。
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
head = curr = ListNode()
carry = val = 0
while carry or l1 or l2:
val = carry
if l1: l1, val = l1.next, l1.val + val
if l2: l2, val = l2.next, l2.val + val
carry, val = divmod(val, 10)
curr.next = curr = ListNode(val)
return head.next
- 一开始就检查l1,l2,carry状态。
- 哎呀,这个参考答案太高级了,学不会学不会
- //表示整数除法。15//10=1。
- divmod() 函数返回当参数 1 除以参数 2 时包含商和余数的元组



