鏈表之超直白的兩數相加

給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

這道題並不難,不過寫代碼之前一定先搞清楚這兩種情況

  • 兩鏈表不等長
  • 兩鏈表等長

不等長時

  • 我們要選擇最長的鏈表保存結果
  • 還要計算進位,和後續位的相加

等長時

  • 哪個鏈表都可以保存
  • 同樣進位計算,只不過僅有一位

這樣看來不等長的計算包含了等長計算。所以我們默認不等長解決

步驟:

  1. 比較長度,選擇最長鏈表a保存結果過
  2. 兩鏈表相加,直到最短鏈表b到表尾
  3. 進位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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章