給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。
如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
**:力扣(leetcode)
根據題目,我們要複習關於鍊錶的基礎知識,鍊錶作為資料結構的基本
非線性資料結構,主要有資料(val)和指標(next)構成,我們可以再python中
用類來定義乙個基礎的鍊錶結構:
通過類定義乙個初始狀態為non
enone
none
的資料節點:
class listnode():
def __init__(self,x):
self.val=x
self.next=none
在定義完鍊錶的資料結構後,我們可以開始解題:我們要考慮如下幾個問題:
如何高效的解決相加數字的位數問題?例如三位數和二位數相加.
如何解決進製問題
如何解決鍊錶節點為none 報錯問題
我們從解決以上三個問題來展開我們的論述:
開始時考慮通過判斷語句來分別構建不同位數情況,但是無論什麼情況下,用到判斷語句會讓情況變得複雜,讓**變得冗長無效,所以我們考慮用迴圈語句來解決位數問題,兩數相加,我們無論如何都會加到最高位,較低位數字在高位置0:通過如下**表示我們需要表示的含義:
#l1,l2是含有不同節點的鍊錶
while(l1 or l2): #這句**的意思是,迴圈到l1,l2的最高位
x=l1.val if l1 else 0
y=l2.val if l2 else 0 #這裡我為什麼要以l1和l2為判斷條件呢?
#因為我上面提到的第三個問題,如果鍊錶節點為none的話,我們直接
#呼叫鍊錶的屬性會報錯,所以鍊錶的判斷中,我們需要以它本身而不是
#它的屬性來判斷,避免出錯
if (l1!=none):
l1=l1.next
if(l2!=none):
l2=l2.next
我們用car
ry
carry
carr
y來表示進製,通過////
//整數除法來確定carry的值,因此我們在上面的基礎加入進製:
carry=0
a=listnode(0)
while(l1 or l2):
x=l1.val if l1 else 0
y=l2.val if l2 else 0
res=x+y+carry
s=listnode(res%10)
a.next=s
carry=res//10
if (l1!=none):
l1=l1.next
if(l2!=none):
l2=l2.next
a=a.next
如果發生最高位進製的情況會怎麼樣呢?我們需要在之前的**上加上乙個判斷條件,如果最後一次進製不為0,我們就需要在所求鍊錶的尾部加入進製值 。
if carry!=0:
a.next=listnode(carry)
但是這時候還會發生乙個問題,我們的結果鍊錶a
aa在一邊遍歷一遍賦值.等賦值完後,鍊錶已經到了表尾,這時候返回的鍊錶不是我們需要的,我們需要通過**複製鍊錶b
bb來讓鍊錶b
bb充當邊賦值邊遍歷的過程,我們通過返回被複製的鍊錶作為我們的結果。
# definition for singly-linked list.
class listnode(object):
def __init__(self, x):
self.val = x
self.next = none
class solution(object):
def addtwonumbers(self, l1, l2):
s=listnode(0)
a=scarry=0
while(l1 or l2):
x=l1.val if l1 else 0 #當它跳到val的時候,如果l為節點且為空的話 就會報錯
y=l2.val if l2 else 0
res=listnode((x+y+carry)%10)
a.next=res
carry=(x+y+carry)//10 #整數除法
a=a.next
if (l1!=none):
l1=l1.next
if (l2!=none):
l2=l2.next
if carry!=0:
a.next=listnode(1)
return s.next
因為我們定義的預設next=none,所以鍊錶要用節點來判斷,因為節點要麼位none 要麼為class ,不要用節點的屬性來判斷,當節點為none時,用屬性判斷會報錯。
.然後這個是常規的位數相加問題,只不過套上了鍊錶的外皮,但是本質是一樣,是進製和相應位數的數字相加,我們需要考慮多種情況,例如最高位進製的問題,不同位數的問題。
乙個**複製的問題也比較有趣,我們讓a=s
a=sa=
s,然後讓a
aa代替s
ss邊遍歷邊複製,a的值也會相應的複製到s,也就是所謂的**複製,複製的值變也為導致被複製的值變化。
Leetcode 鍊錶 2 兩數相加
給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...
leetcode 2 兩數相加(鍊錶)
給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8 ...
leetcode 2 兩數相加(鍊錶)
給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...