不說廢話,直接上**,思路是用乙個while迴圈和乙個加權數來獲得鍊錶中完整的數值,然後同理反向將最終結果轉化為鍊錶,唯一的問題是迴圈中不知道該怎樣儲存節點的值,於是放到了列表裡。
# definition for singly-linked list.
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class
solution
:def
addtwonumbers
(self,l1,l2)
: ss=
0for i in
[l1,l2]
: n,
sum=0,
0while i:
#累加獲得兩個鍊錶的值
sum+= i.val *
10** n
i = i.
next
n +=
1 ss+=
sum n=
len(
str(ss))-
1 ls=
while n>=0:
print
(ss//
10**n)
p1=listnode(ss//
10**n)
ss%=
10**n
n-=1if
len(ls)
>=2:
p1.next
=ls[-2
]return ls[-1
]
執行用時:104ms;記憶體消耗:14.5mb,打敗了35%的使用者,基本也是個菜雞演算法,貼上來貢獻一下思路(不要臉)參考了一下大佬的演算法,主要進行了**量的優化,在思路上沒什麼區別,然後把我不太會的建立鍊錶做了個優化。
class
solution
:def
addtwonumbers
(self, l1: listnode, l2: listnode)
-> listnode:
#累加獲得鍊錶的數字和
ss=0for i in
[l1,l2]
: n,
sum=0,
0while i:
sum+= i.val *
10** n
i = i.
next
n +=
1 ss+=
sum#翻轉由鍊錶生成的list
sum =
list
(str
(ss))[
::-1
]#構建兩個臨時節點,用於形成最終的鍊錶
tmp_node = listnode(
none
) node = listnode(
none
)for i in sum:
if tmp_node.val is
none
: tmp_node = listnode(i)
node = tmp_node
else
: tmp_node.
next
= listnode(i)
tmp_node = tmp_node.
next
return node
執行用時 :80 ms, 在所有 python3 提交中擊敗了88.97%的使用者說實話我還是超喜歡用空間換時間的。記憶體消耗 :14 mb, 在所有 python3 提交中擊敗了5.06%的使用者
力扣 2鍊錶實現兩數相加
題目描述 給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 ...
力扣兩數相加
描述 給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。示例 輸入 2 4 3 5 6 4 輸出 7 0 8 definition for singl...
力扣 兩數相加
給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...