給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
這道題並不難,不過寫代碼之前一定先搞清楚這兩種情況
- 兩鏈表不等長
- 兩鏈表等長
不等長時
- 我們要選擇最長的鏈表保存結果
- 還要計算進位,和後續位的相加
等長時
- 哪個鏈表都可以保存
- 同樣進位計算,只不過僅有一位
這樣看來不等長的計算包含了等長計算。所以我們默認不等長解決
步驟:
- 比較長度,選擇最長鏈表a保存結果過
- 兩鏈表相加,直到最短鏈表b到表尾
- 將進位c和a剩下的位相加.
代碼:
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
#c 保留進位
c=0
a=l1
b=l2
#找出最先到尾的鏈表
while a and b:
a=a.next
b=b.next
#用a保存長鏈表,b保存短鏈表;a不爲空時,說明l1長,存l1;否則l2長,a存l2
if a:
a=l1
b=l2
else:
a=l2
b=l1
#保存長鏈表表頭
v=a
#相加,直到最短鏈表到尾
while 1:
c,a.val=divmod(a.val+b.val+c,10)
b=b.next
#兩鏈表相同時,同時到null,但a可能要進位加一增長鏈表,所以a不能過度到null(例【5】和【5】)
if not b:
break
a=a.next
#當有進位時
while c:
#a的下一位非null,下一位直接加一
if a.next:
a=a.next
c,a.val=divmod(a.val+c,10)
#當a的下一位爲null,增加鏈表長,值爲1,c=0結束
else:
a.next=ListNode(1)
c=0
return v