鍊錶兩數相和 2 Leetcode

2021-10-01 03:10:15 字數 2774 閱讀 1332

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。

如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。

您可以假設除了數字 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 輸出 ...