題目描述解法一:python給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。
如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
把鍊錶轉化為數字進行求和後在返回成煉表,當然這道題有些處心積慮的是如果用c/c++這個方法就不得行,因為其中有測試樣例超出了int的長度,但是對python來說可以全然不顧。當然這個方法也是最為簡便的方法,既不用考慮進製,也不用擔心兩數字長度不一要補0.
# 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:
defget_num
(l):
ifnot l:
return
0return l.val + get_num(l.
next)*
10def
make_list
(n):
if n ==0:
return
none
l = listnode(n%10)
l.next
= make_list(n//10)
return l
s = get_num(l1)
+ get_num(l2)
if s ==0:
return l1
return make_list(s)
注意,在python中," / 「就表示 浮點數除法,返回浮點結果;」 // "表示整數除法。
解法二:c++ 利用鍊錶,原理同大數加法
偽**如下:
請注意,我們使用啞結點來簡化**。如果沒有啞結點,則必須編寫額外的條件語句來初始化表頭的值
請特別注意以下情況:
l1=[0,1],l2=[0,1,2] 當乙個列表比另乙個列表長時
l1=,l2=[0,1] 當乙個列表為空時,即出現空列表
l1=[9,9],l2=[1] 求和運算最後可能出現額外的進製,這一點很容易被遺忘
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
if(carry>
0) curr-
>next =
newlistnode
(carry)
;return dummyhead.next;}}
;
複雜度分析
時間複雜度:o
(max(
m,n)
)o(\max(m, n))
o(max(m,
n)),假設 m
mm 和 n
nn 分別表示 l1l1
l1和 l2l2
l2的長度,上面的演算法最多重複 max(
m,n)
\max(m, n)
max(m,
n)次。空間複雜度:o
(max(
m,n)
)o(\max(m, n))
o(max(m,
n)), 新列表的長度最多為max(
m,n)
+1
\max(m,n) + 1
max(m,
n)+1
。這裡補充說明幾個知識:
" ->" 和 「.」 的區別:前者是指標,後者是結構體
null和nullptr的區別:參見c++中nullptr
LeetCode2 兩數相加
嗯。今天兩個簡單題,我可能要墮落了 先貼第乙個 給定兩個非空鍊錶來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回乙個新的鍊錶。你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8原因 342 465 807...
LeetCode 2 兩數相加
題目 給定兩個非空鍊錶來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回乙個新的鍊錶。你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8 原因 342 465 807 解題 這題就比較簡單了,兩數相加處理好...
LeetCode 2 兩數相加
題目描述 給定兩個非空鍊錶來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回乙個新的鍊錶。你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。題目思路 先從最低有效位也就是列表 l1 和 l2 的表頭開始相加。由於每位數字都應當處於 0 9 的範圍內,我們計算...