[LeetCode] 2. Add Two Numbers 題解
給你兩個 非空 連結串列,分別代表兩個非負整數,它們的高低位順序和連結串列順序相反,連結串列中,每個節點代表一位數,要求將兩個連結串列相加,結果也以連結串列形式返回。
假設連結串列都不會以 0 開頭,除了 0 本身外。
例子:
輸入: (2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出: 7 -> 0 -> 8 解釋: 342 + 465 = 807. 複製程式碼
問題難度
Medium
解題思路
這道題雖然標中等難度,但實際上卻比較簡單,因為連結串列的順序和數字的高低位順序相反,即連結串列頭是低位,而連結串列尾是高位,所以把兩個連結串列代表的數相加,實際上就是按連結串列順序,依次從頭(低位)到尾(高位)對兩個連結串列對應的節點做加法操作。所以,這道題的時間複雜度為。
此外,寫程式時還需要注意進位的問題,如果有進位,則需要用一個變數來標記,我們尤其需要注意下面這樣的 case:
1 + 9 -> 9 -> 9 = 0 -> 0 -> 0 -> 1 複製程式碼
在效能的優化上,我發現如果減少記憶體分配操作,可以極大的提升執行速度,也就是說,我們可以利用現有連結串列的節點,將計算結果儲存在裡面,這樣,整個程式基本上不需要建立新節點,你的程式一定可以跑一個好分數:
class ListNode(object): def __init__(self, x): self.val = x self.next = None class Solution(object): def addTwoNumbers(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ carry = 0 ret = last = ListNode(0) ret.next = last.next = l1 while l1 and l2: val = l1.val + l2.val + carry carry = val / 10 val = val % 10 l1.val = val l2 = l2.next last = l1 l1 = l1.next if l2: last.next = l2 l1 = last.next while l1: val = l1.val + carry carry = val / 10 l1.val = val % 10 last = l1 l1 = l1.next if carry == 1: last.next = ListNode(carry) return ret.next 複製程式碼