leetcode演算法 兩數相加

2021-10-01 15:49:56 字數 2261 閱讀 5586

這一次真的**了,寫了好久卻忽略了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...