LeetCode 2:兩數相加(自己寫的)

給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章