兩數相加Ⅰ和Ⅱ

strive_2021發表於2020-09-25

一、第2題

1.題目介紹

給出兩個 非空 的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。

如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。

您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/add-two-numbers

2.思路介紹

總體上四個步驟,1.遍歷l1和l2相同長度的部分,將兩者相加的值插入目標列表。2.遍歷l1剩餘部分,將值插入目標列表,若有的話。3.遍歷l2剩餘部分,將值插入目標列表,若有的話。4.若最後一位大於十,則需進位。細節上用mark來標記進位。

3.程式碼展示

def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        if not l1 and not l2: return None
        move1 = l1
        move2 = l2
        dummy = ListNode(0)
        move = dummy
        mark = 0
        while l1 and l2:
            t = l1.val + l2.val + mark
            if t >= 10:
                n = t%10 
                mark = 1
            else:
                n = t%10 
                mark = 0
            move.next = ListNode(n)
            move = move.next
            l1 = l1.next
            l2 = l2.next
        while l1:
            t = l1.val + mark
            if t >= 10:
                n = t%10
                mark = 1
            else:
                n = t%10
                mark = 0
            move.next = ListNode(n)
            move = move.next
            l1 = l1.next
        while l2:
            t = l2.val + mark
            if t >= 10:
                n = t%10
                mark = 1
            else:
                n = t%10
                mark = 0
            move.next = ListNode(n)
            move = move.next
            l2 = l2.next
        if mark == 1:
            move.next = ListNode(1)
            move = move.next 
        return dummy.next

二、第445題

1.題目介紹

給你兩個 非空 連結串列來代表兩個非負整數。數字最高位位於連結串列開始位置。它們的每個節點只儲存一位數字。將這兩數相加會返回一個新的連結串列。

你可以假設除了數字 0 之外,這兩個數字都不會以零開頭

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/add-two-numbers-ii

2.思路介紹

1.將l1和l2反轉。
2.將l1的值加l2的值得dummy。
3.反轉dummy

3.程式碼展示

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        def reverse(n):
            pre,cur = None,n
            while cur:
                cur.next,pre,cur = pre,cur,cur.next
            return pre
        l1 = reverse(l1)
        l2 = reverse(l2)
        dummy = ListNode(0)
        move = dummy
        mark = 0
        #遍歷l1和l2
        while l1 and l2:
            t = l1.val + l2.val + mark
            if t >= 10:
                n = t%10 
                mark = 1
            else:
                n = t%10 
                mark = 0
            move.next = ListNode(n)
            move = move.next
            l1 = l1.next
            l2 = l2.next
        #遍歷l1
        while l1:
            t = l1.val + mark
            if t >= 10:
                n = t%10
                mark = 1
            else:
                n = t%10
                mark = 0
            move.next = ListNode(n)
            move = move.next
            l1 = l1.next
        #遍歷l2
        while l2:
            t = l2.val + mark
            if t >= 10:
                n = t%10
                mark = 1
            else:
                n = t%10
                mark = 0
            move.next = ListNode(n)
            move = move.next
            l2 = l2.next
        #查漏
        if mark == 1:
            move.next = ListNode(1)
            move = move.next
        dummy.next = reverse(dummy.next)
        return dummy.next

總結

沒有看大佬們的題解,自己想出來的,所以就發出來了。明示前幾天寫的題目都是看大佬,自己沒有寫出來。其中一個題目的思路是將連結串列連成環,再截斷;另外一個題目的思路是怎麼將節點設為頭節點。今天的程式碼很容易想出來,所以寫的程式碼很長,而大佬們程式碼簡單而且高效,比起來感覺自己實在是太慚愧了。(PS:今天沒有看大佬們的題解,明天好好看看,昇華一下自己的人生)

相關文章