每天一道程式設計題 LeetCode-Add Two Numbers
阿新 • • 發佈:2018-12-12
首先感謝同學們對小天的支援,今天將再為大家講解一題Add Two Numbers,LeetCode將其歸為中等難度。
題目簡介
用兩個空單鏈表儲存非負整型數,單鏈表的節點以逆序儲存整型數的每一位數字。將兩個整形數相加,並用連結串列返回(實際上也可以用python的list型別上傳)。舉例說明:輸入連結串列為,(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出,7 -> 0 -> 8 。
官方給出的python單鏈表實現如下,做題的時候需要用到:
class ListNode: def __init__(self, x): self.val = x self.next = None
解法一:
這道題的基礎解法很好想到,遍歷兩個單鏈表,只要注意進位和單鏈表位數上存在不同。
class Solution: def addTwoNumbers(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ result = [] a = 0 while l1 or l2: if l1 != None and l2 != None: a, b = divmod(l1.val + l2.val + a, 10) result.append(b) elif l1 == None: a, b = divmod(l2.val + a, 10) result.append(b) elif l2 == None: a, b = divmod(l1.val + a, 10) result.append(b) if l1 != None: l1 = l1.next if l2 != None: l2 = l2.next if a == 1: result.append(a) return result
解法一的結果沒有以單鏈表輸出,測試程式同樣接受。該解法在LeetCode上的用時為128ms。
解法二:
考慮一種情況,兩個整型數的位數相差較大時,解法一需要判斷次,為最大位數。細心的同學就發現根本不需要做這些判斷,當位數小的整型數結束遍歷後,最好只對位數大的整型數繼續做判斷。
class Solution: def addTwoNumbers(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ result = [] a = 0 res = ListNode(-1); while l1 and l2: a, b = divmod(l1.val + l2.val + a, 10) result.append(b) l1 = l1.next l2 = l2.next if l1 != None: res = l1 if l2 != None: res = l2 if res.val >= 0: while res: a, b = divmod(res.val + a, 10) result.append(b) res = res.next if a == 1: result.append(a) return result
單鏈表res中儲存剩餘數字,這樣在接下的過程中,只需要對單個連結串列進行操作。總的判斷次數到達兩整型數位數之和。在LeetCode上的用時為116ms。
總結:
在LeetCode上最優解法和本文的解法二在思想上差別並不大,但是實現上利用輸入的某個單鏈表,這樣可以省去建立、操作新連結串列和列表的時間花費。