給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。
如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)第一種「暴力解法」是分別遍歷鍊錶 l1 和 l2 ,然後把得到的結果相加,再建立新鍊錶l3,當然了,想一想就好,一般暴力解法都容易超時。輸出:7 -> 0 -> 8
原因:342 + 465 = 807
第二種思路有些類似,就是在遍歷鍊錶的同時取值相加,唯一的難點就是在迴圈中使用同乙個變數增加鍊錶結點。這裡取了個巧,給head.next
賦值,避免當前結點被覆蓋。同時返回結果也是l3.next
,鍊錶可以看成乙個巢狀的字典。
# definition for singly-linked list.
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class
solution
:def
addtwonumbers
(self, l1: listnode, l2: listnode)
-> listnode:
l3 = listnode(0)
head = l3
step =
0while l1 or l2 :
x = l1.val if l1 else
0 y = l2.val if l2 else
0
result = x + y + step
step = result //
10
head.
next
= listnode(result %10)
head = head.
next
l1 = l1.
next
if l1 else
none
l2 = l2.
next
if l2 else
none
if step ==1:
head.
next
= listnode(1)
return l3.
next
注意進製以及結點為 none 的情況的校驗。
值得一提的是注釋部分只是提示鍊錶的屬性,如果取消注釋是會報錯的,在 leetcode 上死活除錯不過,被小坑了一把,囧。
雖然超過了100%的python3提交,但是依然有優化的空間,演算法優化的本身就是和自己較勁嘛 ^_^ 。
比如我們可以假設一種極端情況,就是其中 l2 長度遠遠大於 l1 ,例如:24 + 382847278173498112933718......
,那麼根據我們上面的演算法,每次都要重新相加,耗時且消耗額外的記憶體。
優化的思路是,當判斷到 l1 為 none 時,新鍊錶的剩下的結點就是 l2 剩下的結點,只要讓head.next = l2.next
就可以了,無需重新計算。當然了,l2 也可能為 none。**的現有邏輯需要一些小變動,同時需要單獨判斷進製的情況。
具體實現待更 …
python3兩數相加的實現示例
給你兩個 非空 的鍊錶,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式儲存的,並且每個節點只能儲存 一位 數字。請你將兩個數相加,並以相同形式返回乙個表示和的鍊錶。你可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 1 輸入 l1 2,4,3 l2 5,6,4 輸出 7,0,8 ...
力扣 2 兩數相加 Python3
題目 給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 ...
python3 兩數之和
給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9...