leetcode 2 兩數相加

2021-10-01 10:57:32 字數 1439 閱讀 4656

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,

並且它們的每個節點只能儲存 一位 數字。

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

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

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

輸出:7 -> 0 -> 8

原因:342 + 465 = 807

思路如下:

新建立乙個鍊錶,每次相加的結果存放到新的鍊錶中,這裡主要的乙個問題就是進製。每次相加後都需要進行判斷,如果相加的和大於10,則需要進製,存放到新鍊錶中的資料為原鍊錶節點資料相加後的資料再加上上一次進製的結果對10取餘。由此可知,相加所得到的sum是l1.val + l2.val + add(這裡我用add變數來表示進製),而實際存放到新鍊錶中的結果是sum%10,而新的進製為sum/10。

注意:有乙個容易出錯的點,在迴圈結束後,其實所有的運算並沒有結束,我們還需要判斷最後一次運算有沒有進製,如果有,需要再加乙個val為1的節點。比如:5+5=10,如果迴圈結束後不進行判斷,add中的進製沒有用上,最後的結果將為0,這顯然是不對的。

在**的具體實現過程中,我一度糾結是應該用do-while還是while,判斷的語句應該用||還是&&,條件應該是!=null還是.next!=null。說 結論:使用while,||, !=null。比較糾結的是到底應該用與還是或。最開始考慮的是用與來做,這樣在迴圈的過程中,兩個原鍊錶都一定是非空的,這樣會出現乙個問題,就是迴圈結束後,實際上加法運算還沒又結束,我需要再去判斷是l1到頭了還是l2到頭了還是兩個都到頭了,不同的情況將執行不同的操作,於是我考慮直接使用或運算,在迴圈中對鍊錶加一次判斷,如果鍊錶已經為空了,就讓相加的值為0,不為空則使用本身的.val進行相加,指標的後移操作也再加乙個判斷,如果已經為空,就不再後移,如果不為空,則指向下乙個。聽上去似乎很複雜,但其實三目運算子就可以很好的解決這個問題。

public listnode addtwonumbers(listnode l1, listnode l2) 

if(add != 0)

return ret.next;

}

最後再說一下,這個題目難倒我的其實是新鍊錶的建立這一點,我一直想不明白建立了新的節點後如果不賦值就沒辦法讓另乙個節點指向它,後續操作無法進行,而如果賦值的話又會出現鍊錶的頭部有乙個不應該存在的值。但其實我們只需要在返回的時候返回新建立的煉表頭節點.next就可以了。

最後的最後再說一下,我在最開始做這道題目的時候,把每個鍊錶都轉換成了整數值再進行計算,明明測試用例都通過了但是提交的還是不對,然後才想到使用鍊錶來表示乙個整數的話,這個整數是可以很大的,使用int、double、long都是不行的因為理論上來說鍊錶可以無限大的(吧)。所以這個題目只能使用鍊錶來存放鍊錶相加的結果。

LeetCode2 兩數相加

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

LeetCode 2 兩數相加

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

LeetCode 2 兩數相加

題目描述 給定兩個非空鍊錶來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回乙個新的鍊錶。你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。題目思路 先從最低有效位也就是列表 l1 和 l2 的表頭開始相加。由於每位數字都應當處於 0 9 的範圍內,我們計算...