题目:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
我的答案:
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++实现的
参考答案1:
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状态。
参考答案 2:
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 时包含商和余数的元组