我的思路
2022.9.3 Python3刷题,采用的思路是先把链表转化为int,然后相加之后再把int转化为链表。在把链表转化为int的时候,位数转化应该使用10的幂运算,但是写成了10的乘法,导致出现bug。之前的错误写法:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
count = 0
num1, num2 = 0, 0
while l1:
# WRONG !!!
num1 += count * 10 + l1.val
l1 = l1.next
count += 1
count = 0
while l2:
# WRONG !!!
num2 += count * 10 + l2.val
l2 = l2.next
count += 1
sum12 = num1 + num2
print(num1, num2)
res = ListNode()
head = res
while sum12 != 0:
head.next = ListNode(val=sum12 % 10)
head = head.next
sum12 = sum12 // 10
return res.next
正确的写法应该是:
while l1:
num1 += pow(10, count) * l1.val
l1 = l1.next
count += 1
count = 0
while l2:
num2 += pow(10, count) * l2.val
l2 = l2.next
count += 1
另外,[0]和[0]相加的情况应该也考虑进去,保证return的是[0]而不是[]:
if res.next:
return res.next
else:
return ListNode()
本题目需要二刷巩固。
官方题解
由于输入的两个链表都是逆序存储数字的位数的,因此两个链表中同一位置的数字可以直接相加。
使用官方题解的思路的解答:
class Solution:
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
head = ListNode()
curr = head
carry = 0
while l1 or l2 or carry:
value = 0
if l1:
value += l1.val
l1 = l1.next
if l2:
value += l2.val
l2 = l2.next
carry, value = divmod(value + carry, 10)
curr.next = ListNode(val=value)
curr = curr.next
return head.next
注意:最终的进位如果多了一位的话,要考虑进去,如图所示,在while循环中加入carry的判断,这样l1和l2的每一位都遍历结束后,如果carry还有值,就会当作新的最高位。