leetCode刷題 2 兩數相加

2021-09-11 13:15:17 字數 3094 閱讀 4856

給定兩個非空鍊錶來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回乙個新的鍊錶。

你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

輸出:7 -> 0 -> 8

原因:342 + 465 = 807

複製**

題目的前提,將數字使用鏈結來儲存,比如數字 123 ,儲值為3->2->1。個位數在前,接著是十位、百位......。

要做的事情是:2個數字,都使用了鍊錶來儲存,我們需要將這兩個數字相加,得到他們的和,將他們相加的結果儲存成跟之前一樣結構的鍊錶。

需要做題者熟悉鍊錶結構和鍊錶的遍歷。

思路一:

鍊錶畢竟是鍊錶,無法直接簡單地進行相加操作。所以比較容易想到的思路是,兩個鍊錶分別轉化成數字,然後將兩個數字相加,得到了和之後,再將結果轉化成鍊錶。

思路二:

由於是鍊錶是個數在前,接著是十位、百位......所以可以同時遍歷兩個鍊錶,然後將遍歷出來的元素進行相加,將結果轉化成新鍊錶的元素。這樣新鍊錶就是題目所要求的鍊錶。需要注意的事,相加可能會有進製出現,比如9+9=18,此時新元素應該是8,然後下乙個元素的時候應該加上這個進製1。

思路一**

#方法一。將兩個鏈結分別轉成陣列,然後轉成陣列,進行相加運算。得到的結果再轉成陣列,然後轉成鍊錶。

def addtwonumbers(self, l1, l2):

""" :type l1: listnode

:type l2: listnode

:rtype: listnode

"""#遍歷解析第1個數

head1 = l1

a1 =

while (head1):

head1 = head1.next

print

"a1=",a1

#遍歷解析第2個數

head2 = l2

a2 =

while (head2):

head2 = head2.next

print

"a2=",a2

#將第1個陣列轉成數字

num1 = 0

len1 = len(a1)

for i in range(len1):

# print "i=",i

num1 += a1[i]*(10**i)

print

"num1=",num1

#將第2個陣列轉成數字

num2 = 0

len2 = len(a2)

for i in range(len2):

# print "i=",i

num2 += a2[i]*(10**i)

print

"num2=",num2

num = num1 + num2

print

"num=",num

#特殊情況,直接返回

if num == 0:

node = listnode(0)

return node

#將num轉成陣列

a =

i = 1

while (num != 0):

temp = num % (10)

num = num / (10)

print

"temp=",temp

print

"num0=",num

i += 1

print

"a=",a

#將陣列轉成鍊錶

node = listnode(a[0])

head = node

for i in range(1,len(a)):

newnode = listnode(a[i])

head.next = newnode

head = head.next

head.next = none

return node

複製**

思路2**:
#方法二:同時遍歷兩個鍊錶,將對應位的數子相加。如果有進製就記錄下來。

def addtwonumbers(self, l1, l2):

""" :type l1: listnode

:type l2: listnode

:rtyp

"""#頭結點

head = none

#當前節點

currentnode = none

#進製carry = 0

#是否第一次遍歷

isfirst = true

while (l1 or l2 or carry != 0):

#置0val1 = 0

val2 = 0

#計算val1

if l1:

val1 = l1.val

l1 = l1.next

#計算val2

if l2:

val2 = l2.val

l2 = l2.next

#計算val,注意進製也要加

val = val1 + val2 + carry

#大於10的時候表示有進製

if (val/10 > 0):

carry = 1

val = val%10

else:

carry = 0

#建立節點

node = listnode(val)

if isfirst:

#第一次建立節點做特殊處理

currentnode = node

head = currentnode

isfirst = false

else:

currentnode.next = node

currentnode = currentnode.next

return head

複製**

個人目前只懂一丁點python語法,所以不做語法上的優化,而且整體**風格效果會盡量跟c語言趨於一致。

Leetcode刷題(2 兩數相加)

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...

LeetCode刷題 2 兩數相加

題目要求 給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 ...

LeetCode刷題系列 2 兩數相加

題目 給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭 示例 輸入 2 4 3 5 6 4 ...