leetcode hot 100 2 兩數相加

2022-03-29 09:27:35 字數 1473 閱讀 6062

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

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

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

示例:

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

)輸出:

7 -> 0 -> 8

原因:342 + 465 = 807

模擬大數加法,先處理都不為空的結點,然後分別處理另乙個更長的鍊錶中剩下的結點,最後還要考慮fn的值是否需要再建立乙個結點。

1

class

solution

18//

處理p1多餘的結點

19while(p1 != null)26

//處理p2多餘的結點

27while(p2 != null)34

35if(fn != 0)

38return

head.next;39}

40 }

leetcode 執行用時:2 ms > 99.92%, 記憶體消耗:39 mb > 46.86%

時間複雜度:o(max(n1, n2))。n1和 n2 分別為鍊錶的長度,雖然**實現中有3個迴圈,但是通過實現邏輯可以看出所有迭代次數之和剛好是兩個鍊錶長度大的那條的結點個數,即max(n1, n2)。

空間複雜度:o(max(n1, n2))。這是用來儲存結果的鍊錶的長度,如果不考慮這部分空間複雜度,則空間複雜度為o(1)。

思路和思路一一樣,同樣是利用了大數加法的思想,但是可以看出思路一的**太長,存在冗餘**,所以考慮將三個迴圈放在同乙個迴圈中。思路一之所以要分成3個迴圈,是因為擔心其中乙個鍊錶的長度大於另乙個鍊錶長度,這樣遍歷到短鍊錶的結尾時長鍊錶還沒有遍歷完,如果繼續遍歷則會導致短鍊表空指標異常。所以改進就是取值之前先判斷結點是否為空,如果為空,則用0代替,因為0不會改變結果。當然指標後移的時候也要判斷結點是否為空,如果不為空才能後移。

1

class

solution

20if(p2 != null)23

}2425if(fn != 0)

28return

head.next;29}

30 }

leetcode 執行用時:2 ms > 99.92%, 記憶體消耗:38.8 mb > 75.26%

時間複雜度:o(max(n1, n2))。n1和 n2 分別為鍊錶的長度,可以看出所有迭代次數之和剛好是兩個鍊錶長度大的那條的結點個數,即max(n1, n2)。

空間複雜度:o(max(n1, n2))。這是用來儲存結果的鍊錶的長度,如果不考慮這部分空間複雜度,則空間複雜度為o(1)。

leetcode hot 100 56 合併區間

給出乙個區間的集合,請合併所有重疊的區間。示例 1 輸入 intervals 1,3 2,6 8,10 15,18 輸出 1,6 8,10 15,18 解釋 區間 1,3 和 2,6 重疊,將它們合併為 1,6 示例 2 輸入 intervals 1,4 4,5 輸出 1,5 解釋 區間 1,4 和...

leetcode hot 100 55 跳躍遊戲

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 我們可以先跳 1 步,從位置 0 到達 位置 1,然後再從位置 1 跳 3 步到達最後乙個位置。示例 2 輸入...

leetcode hot 100 56 合併區間

給出乙個區間的集合,請合併所有重疊的區間。示例 1 輸入 intervals 1,3 2,6 8,10 15,18 輸出 1,6 8,10 15,18 解釋 區間 1,3 和 2,6 重疊,將它們合併為 1,6 示例 2 輸入 intervals 1,4 4,5 輸出 1,5 解釋 區間 1,4 和...