這一次真的**了,寫了好久卻忽略了int溢位,還是官方的答案簡介直接
/**
* arithmetic:the sum of two numbers
* name:nanfang
* time:2019/12/22
* content:這是我自己寫的,我是把數算出來然後加一起的
* */
public
static listnode addtwonumbers
(listnode l1, listnode l2)}if
(p2!=null)
}int num=num_1+num_2;
system.out.
println
("num:"
+num+
" "+
"num_1:"
+num_1+
" "
+"num_2:"
+num_2)
; listnode list=
newlistnode
(num%10)
; listnode p=list;
num=num/10;
while
(num>0)
return list;
}
看官方的答案
方法:初等數學
思路我們使用變數來跟蹤進製,並從包含最低有效位的表頭開始模擬逐位相加的過程。
圖1,對兩數相加方法的視覺化: 342 + 465 = 807342+465=807,每個結點都包含乙個數字,並且數字按位逆序儲存。
演算法就像你在紙上計算兩個數字的和那樣,我們首先從最低有效位也就是列表 l1l1 和 l2l2 的表頭開始相加。由於每位數字都應當處於 0 \ldots 90…9 的範圍內,我們計算兩個數字的和時可能會出現 「溢位」。例如,5 + 7 = 125+7=12。在這種情況下,我們會將當前位的數值設定為 22,並將進製 carry = 1carry=1 帶入下一次迭代。進製 carrycarry 必定是 00 或 11,這是因為兩個數字相加(考慮到進製)可能出現的最大和為 9 + 9 + 1 = 199+9+1=19。
偽**如下:
將當前結點初始化為返回列表的啞結點。 將進製 carrycarry 初始化為 00。 將 pp 和 qq 分別初始化為列表 l1l1 和 l2l2 的頭部。 遍歷列表 l1l1 和 l2l2 直至到達它們的尾端。 將 xx 設為結點 pp 的值。如果 pp 已經到達 l1l1 的末尾,則將其值設定為 00。 將 yy 設為結點 qq 的值。如果 qq 已經到達 l2l2 的末尾,則將其值設定為 00。 設定 sum = x + y + carrysum=x+y+carry。 更新進製的值,carry = sum / 10carry=sum/10。 建立乙個數值為 (sum \bmod 10)(summod10) 的新結點,並將其設定為當前結點的下乙個結點,然後將當前結點前進到下乙個結點。 同時,將 pp 和 qq 前進到下乙個結點。 檢查 carry = 1carry=1 是否成立,如果成立,則向返回列表追加乙個含有數字 11 的新結點。 返回啞結點的下乙個結點。 請注意,我們使用啞結點來簡化**。如果沒有啞結點,則必須編寫額外的條件語句來初始化表頭的值。
請特別注意以下情況:
測試用例 說明
l1=[0,1]l1=[0,1],l2=[0,1,2]l2=[0,1,2] 當乙個列表比另乙個列表長時
l1=l1=,l2=[0,1]l2=[0,1] 當乙個列表為空時,即出現空列表
l1=[9,9]l1=[9,9],l2=[1]l2=[1] 求和運算最後可能出現額外的進製,這一點很容易被遺忘
public listnode addtwonumbers
(listnode l1, listnode l2)
if(carry >0)
return dummyhead.next;
}
複雜度分析
時間複雜度:o(\max(m, n))o(max(m,n)),假設 mm 和 nn 分別表示 l1l1 和 l2l2 的長度,上面的演算法最多重複 \max(m, n)max(m,n) 次。
空間複雜度:o(\max(m, n))o(max(m,n)), 新列表的長度最多為 \max(m,n) + 1max(m,n)+1。
拓展如果鍊錶中的數字不是按逆序儲存的呢?例如:
(3 \to 4 \to 2) + (4 \to 6 \to 5) = 8 \to 0 \to 7
(3→4→2)+(4→6→5)=8→0→7
leetcode演算法 兩數相加
解析 本題兩種方式解決 一種是算出兩數相加得出和,再轉化為鍊錶,但是這樣的話和可能會很大就回導致得到的和無法接受要用到long型別甚至long long型別 另一種方式 我們可以注意到我們只需將兩個鍊錶同時遍歷相加將得到的和mod10即可插入到新的鍊錶中,但由於會和會大於10而進1所以我們要設定乙個...
leetcode 兩數相加(演算法)
兩數之和 給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。看到題目我首先想到的是將目標值 target 拆分,將目標值變成0 target,1 target 1 target 2 target target 2 由於第一次做演...
LeetCode 中級演算法 兩數相加
給定兩個非空鍊錶來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回乙個新的鍊錶。你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8原因 342 465 807一貫的愚蠢暴力解法 definition for...