兩數相加 LeetCode (8)

2021-09-10 22:09:49 字數 2145 閱讀 2488

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

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

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

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)輸出:7 -> 0 -> 8原因:342 + 465 = 807
首先,自己在鍊錶用於儲存方面的表達上面,比較不會,看了看解決思路如下:

下面表示了鍊錶的形式,這樣一看,自己就覺得一目了然了。

知識補充:

個人理解,啞節點(dummy node)是初始值為null的節點,建立在使用到鍊錶的函式中,可以起到避免處理頭節點為空的邊界問題的作用,減少**執行異常的可能性。

也就是說,啞節點的使用可以對**起到簡化作用省略當函式的入口引數為空時的判斷)。

啞節點(dummy node)是乙個被人為建立的節點,雖然其內容為null,但是它在堆中有占有一定的空間。

啞節點的使用可以避免邊界問題的處理,達到簡化**與減少**出錯可能性的目的。

演算法:

就像你在紙上計算兩個數字的和那樣,我們首先從最低有效位也就是列表l1和l2的表頭開始相加。由於每位數字都應當處於0...9的範圍內,我們計算兩個數字的和時可能會出現溢位。例如, 5+7=12。在這種情況下,我們會將當前位的數值設定為2,並將進製carry=1帶入下一次迭代。進製carry必定是0或1,這是因為兩個數字相加(考慮到進製)可能出現的最大和為9+9+1=19

偽**如下:

將x設為節點p的值,如果p已經到達l1的末尾,則將其值設為0。

將y設為節點q的值,如果q已經到達l2的末尾,則將其值設為0。

設定 sum = x + y + carry

更新進製的值, carry = sum/10

建立乙個數值為(sum mod 10)的新結點,並將其設定為當前節點下的乙個結點,然後將當前結點前進到下乙個結點。

同時,將p和q前進到下乙個結點

python **如下:

# definition for singly-linked list.

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class solution:

def addtwonumbers(self, l1, l2):

""":type l1: listnode

:type l2: listnode

:rtype: listnode

"""re = listnode(0)

r =re

carry = 0

while(l1 or l2):

x = l1.val if l1 else 0

y = l2.val if l2 else 0

s = carry + x + y

carry = s//10

r.next = listnode(s%10)

r = r.next

if(l1 != none):

l1 = l1.next

if(l2 != none):

l2 = l2.next

if(carry >0):

r.next = listnode(1)

return re.next

總結:

鍊錶知識還是掌握的不是很深,理解的也不是很熟,需要多加練習

leetcode 8 三數之和

給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。雙指標from collections import defaultdict class solution def threesum self,nums ...

LeetCode 兩數相加

題目來自leetcode 注意幾點 鍊錶對應結點相加時增加前乙個結點的進製,並儲存下乙個結點的進製 兩個鍊錶長度不一致時,要處理較長鍊錶剩餘的高位和進製計算的值 如果最高位計算時還產生進製,則還需要新增乙個額外結點。definition for singly linked list.struct l...

leetcode 兩數相加

給定兩個非空鍊錶來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回乙個新的鍊錶。你可以假設除了數字 0 之外,這兩個數字都不會以零開頭.示例 輸入 2 4 3 5 6 4 輸出 7 0 8 原因 342 465 807 definition for singly ...