[LeetCode By Python] 2. Add Two Numbers

一、題目

Add Two Numbers

二、解題


1)題意

給出兩個(gè)鏈表,把對應(yīng)位置上的值進(jìn)行十進(jìn)制相加(有進(jìn)位),返回鏈表的根節(jié)點(diǎn)。

2)輸入輸出說明

輸入:兩個(gè)列表的根節(jié)點(diǎn)(并不是整個(gè)列表,即leetcode會(huì)把默認(rèn)生成好的列表的根節(jié)點(diǎn)傳入)
輸出:累加之后的根節(jié)點(diǎn)

3)關(guān)鍵點(diǎn)

1)做十進(jìn)制加法時(shí),使用和%10來得出當(dāng)前位的值,使用/10來得出進(jìn)位。
2)如果用常規(guī)解法,在處理不同長度的兩個(gè)鏈表是比較麻煩的。因此我使用了標(biāo)記的方法:

  • 當(dāng)某個(gè)鏈表的next為空了,把其值(val)賦值為-1(題意中所有值都為非負(fù)數(shù),所以-1可以作為一個(gè)標(biāo)示,不會(huì)影響到原本的值)。
  • 在兩個(gè)值相加之前,當(dāng)檢測到存在值為-1的時(shí)候,把值變成0,再進(jìn)行相加(因?yàn)槭羌?,所以并不影響結(jié)果)
  • 跳出條件是兩個(gè)鏈表的值都為-1。
  • 最后要判斷一次進(jìn)位的值是否不為0,如果不為0,需要補(bǔ)上一個(gè)node

4)為什么要賦值為-1,而不是直接賦值為0

因?yàn)槿绻苯淤x值為0,可能存在列表 3,0,3,即原本值就是0,而不是代表鏈表結(jié)束了,這樣會(huì)影響到鏈表。

三、嘗試與結(jié)果

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        resultNode = None
        add = 0
        while True:
            #當(dāng)val為-1的時(shí)候,說明已經(jīng)有l(wèi)ist遍歷完了,這個(gè)時(shí)候需要把val變成0
            if l1.val == -1:
                l1.val = 0
            if l2.val == -1:
                l2.val = 0

            tSum = (l1.val + l2.val + add) % 10
            add = (l1.val + l2.val + add) / 10
            listn = ListNode(tSum)

            if resultNode == None:
                resultNode = listn
                flagNode = resultNode
            else:
                flagNode.next = listn
                flagNode = flagNode.next

            if l1.next != None:
                l1 = l1.next
            else:
                #直接改變當(dāng)前的節(jié)點(diǎn)的值
                l1.val = -1

            if l2.next != None:
                l2 = l2.next
            else:
                l2.val = -1
            #兩個(gè)都為-1了,說明兩個(gè)列表都遍歷完了
            if l1.val == -1 and l2.val == -1:
                break

        if add != 0:
            listn = ListNode(add)
            flagNode.next = listn

        return resultNode

結(jié)果:AC

四、完整調(diào)試代碼

class ListNode(object):
     def __init__(self, x):
         self.val = x
         self.next = None

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        resultNode = None
        add = 0
        while True:
            if l1.val == -1:
                l1.val = 0
            if l2.val == -1:
                l2.val = 0

            tSum = (l1.val + l2.val + add) % 10
            add = (l1.val + l2.val + add) / 10
            listn = ListNode(tSum)

            if resultNode == None:
                resultNode = listn
                flagNode = resultNode
            else:
                flagNode.next = listn
                flagNode = flagNode.next

            if l1.next != None:
                l1 = l1.next
            else:
                l1.val = -1

            if l2.next != None:
                l2 = l2.next
            else:
                l2.val = -1

            if l1.val == -1 and l2.val == -1:
                break

        if add != 0:
            listn = ListNode(add)
            flagNode.next = listn

        return resultNode

if __name__ == '__main__':
    print "----------------- start -----------------"

    l1_1 = ListNode(2)
    l1_2 = ListNode(4)
    l1_3 = ListNode(3)
    l1_1.next = l1_2
    l1_2.next = l1_3

    l2_1 = ListNode(5)
    l2_2 = ListNode(6)
    l2_3 = ListNode(4)
    l2_1.next = l2_2
    l2_2.next = l2_3

    l3_1 = Solution().addTwoNumbers(l1_1,l2_1)
    while l3_1 != None:
        print l3_1.val
        l3_1 = l3_1.next
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容