給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
思路:
其實這道題主要是爲了考察我們對鏈表的熟練使用,算法很簡單,逆序已經使得計算過程簡單了很多,鏈表從左到右不就是個十百千位嗎,兩個指針直接從兩個鏈表的開始直接遍歷就可以了。停止條件是什麼,當然是兩個給定鏈表都被遍歷完爲止,即兩個指針均爲None。
接下來考慮一些特殊情況:
1、對應位數字相加大於10要進位,所以要設置一個變量來存儲進位數。
2、兩個鏈表長度不一致,繼續遍歷就會報錯了,因爲短鏈表指針爲None值了啊。此時我們只需要給短的鏈表後面掛上一個值爲0的結點就可以了繼續了。就好象下圖:
3、最高位相加大於十,也要進位,這個肯定不能加在循環裏,只能在最後判斷,兩個給定鏈表都遍歷完了,如果存儲進位數的變量不等於0,就需要在存儲結果的鏈表中再掛一個節點,值設置爲1也就是進位變量就可以了。
4、最後記得要加頭指針便於輸出。
代碼如下:
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def addTwoNumbers(self, l1, l2):
# L = ListNode(x=0)
l = ListNode(x=0)
prenode = ListNode(x=0)
L=prenode
a = 0
while l1 or l2:
if not l1: l1 = l
if not l2: l2 = l
L.next = ListNode((l1.val + l2.val + a)%10)
a=(l1.val + l2.val + a)//10
l1 = l1.next
l2 = l2.next
L = L.next
if a>0:
L.next=ListNode(a)
return prenode.next
def printlist(l:ListNode)->ListNode:#輸出結果鏈表的函數,提交的時候不需要寫,用來測試的。
while l:
print(l.val)
l=l.next