給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。首先,自己在鍊錶用於儲存方面的表達上面,比較不會,看了看解決思路如下:如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。
您可以假設除了數字 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=19python **如下:偽**如下:
將x設為節點p的值,如果p已經到達l1的末尾,則將其值設為0。
將y設為節點q的值,如果q已經到達l2的末尾,則將其值設為0。
設定 sum = x + y + carry
更新進製的值, carry = sum/10
建立乙個數值為(sum mod 10)的新結點,並將其設定為當前節點下的乙個結點,然後將當前結點前進到下乙個結點。
同時,將p和q前進到下乙個結點
# 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 ...