1. 程式人生 > >每天一道程式設計題 LeetCode-Add Two Numbers

每天一道程式設計題 LeetCode-Add Two Numbers

首先感謝同學們對小天的支援,今天將再為大家講解一題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。

解法二:

考慮一種情況,兩個整型數的位數相差較大時,解法一需要判斷2\times{max}次,max為最大位數。細心的同學就發現根本不需要做這些判斷,當位數小的整型數結束遍歷後,最好只對位數大的整型數繼續做判斷。

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上最優解法和本文的解法二在思想上差別並不大,但是實現上利用輸入的某個單鏈表,這樣可以省去建立、操作新連結串列和列表的時間花費。