一、前言
最近在刷力扣上的題目,之前也刷過很多次,一邊刷一邊忘,很是苦惱。
爲什麼邊學邊忘,很大程度是沒有應用場景,只是被動的進行填鴨式學習。
爲了提高學習效率,覺得還是得堅持寫博客,一方面強化記憶,第二強迫自己創造應用場景,學習知識的同時也在產生知識。
二、題目
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 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