【5分鐘力扣】02. 用python3實現兩數相加

一、前言

最近在刷力扣上的題目,之前也刷過很多次,一邊刷一邊忘,很是苦惱。

爲什麼邊學邊忘,很大程度是沒有應用場景,只是被動的進行填鴨式學習。

爲了提高學習效率,覺得還是得堅持寫博客,一方面強化記憶,第二強迫自己創造應用場景,學習知識的同時也在產生知識。

在這裏插入圖片描述

二、題目

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

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

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

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8 
原因:342 + 465 = 807

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/two-sum

三、單鏈表的相關知識


參考我的其他博文: 【python鏈表】之單向鏈表詳解

四、學習參考視頻

一分鐘教你鏈表反轉


視頻:一分鐘教你鏈表反轉,可以完美解答 算法題206—反轉鏈表

五、解答方法

一、先解決兩個鏈表相加問題,判斷中間是否有結果進位。
二、將生成新鏈表進行鏈表翻轉。

class ListNode:
    def __init__(self, x, next=None):
        self.val = x
        self.next = next  # 讓next默認爲None,方便後期傳值。

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        f = ListNode(0)  # 定義輸出鏈表的第一個節點
        p = f   # p類似於指針,代表輸出鏈表的第一個節點
        carry = 0  # 進位
        while l1 or l2:  # 如果l1或者l2爲空,則循環結束
            x = l1.val if l1 else 0  # 如果l1不爲空則取l1.val否則取0
            y = l2.val if l2 else 0
            res = x + y + carry  # 與進位一起相加的結果
            carry = res // 10  # 檢查是否有進位
            p.next = ListNode(res % 10)  # 這個時候p實際是輸出鏈表的第一個節點,它指向下一個節點的地址
            p = p.next  # 節點進位,這時p指向的是上一行定義的節點
            l1 = l1.next if l1 else 0  # 如果l1不爲空則取l1.next否則取0
            l2 = l2.next if l2 else 0
        if carry > 0:  # 如果到最後還有進位,那麼還要新建個節點記錄進位的值
            p.next = ListNode(1)
        return f.next  # 返回的鏈表一定要從定義的輸出鏈表f的第二個節點開始


if __name__ == '__main__':
    a = ListNode(2, ListNode(4, ListNode(3, )))  # 鏈表a
    b = ListNode(5, ListNode(6, ListNode(4, )))  # 鏈表b
    
    obj = Solution()
    Node = obj.addTwoNumbers(a, b)
    
    while Node:
      	print(Node.val)
        Node = Node.next
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章