給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。
如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)輸出:7 -> 0 -> 8
原因:342 + 465 = 807
2.1 解題思路
題中鍊錶順序正好是低位到高位,先低位相加,有進製保持,下一位計算加上進製,直到最高位相加,如果有進製,生成新的結點儲存。
2.2 我的錯誤**
有時候,從錯誤中才能學到真知識。
現在刷題,很容易到網上找到各種答案,因此,初學者往往因為無法忍受一遍又一遍的除錯,而放棄獨立思考,選擇取拷貝別人的**,以理解別人的**代替了自己刷題的那個拔高的訓練過程,這實在是很可惜的,刷題的效果會大打折扣。
我的錯誤:
應當建立新的鍊錶來儲存結果,保留原鍊錶。因為傳入原鍊錶l1和l2可能還需要用到,不能輕易更改;
解題思路不對:
//執行結果錯誤,方法不對,努力白費,用這個思路改了好多遍,放棄了這個錯誤或繁瑣的思路。
//沒有建立全新的鍊錶,使用l1、l2中較長的儲存結果
class
solution
if (l1 !=null)
if (l1 == null && carry == 1
) listnode(1);
return
l1; }
else
if (l2 == null && carry == 1
) listnode(1);
return
l2; }
}};
好的**應該用比較通用的形式,概括表達出所有可能的情況。**中紅色標註的行是關鍵行。
//一般地,建議建立新鍊錶儲存結果,不在原煉表上直接做修改,因為原鍊錶可能還要使用。
#include
#include
using
namespace
std;
struct
listnode
};typedef listnode*linklist;
class
solution
//最後的進製
if (carry == 1
)
return hl3->next;
}};int
main()
return0;
}//可能的問題:記憶體洩漏,建立的頭節點hl3最終沒有被釋放。
* * definition for singly-linked list.
* struct listnode
* }; */
//優化c++i/o提速
static
const auto __ =() ();
class
solution
if(b !=null)
cur = cur->next;
}if(carry)
return l_result->next;
}};//可能的問題:記憶體洩漏,建立的頭節點l_result最終沒有被釋放。
跳轉另一篇部落格:leetcode 445. 兩數相加 ii
LeetCode002 兩數相加
給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8原...
LeetCode 002 兩數相加
給你兩個非空的鍊錶,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式儲存的,並且每個節點只能儲存 一位數字。請你將兩個數相加,並以相同形式返回乙個表示和的鍊錶。你可以假設除了數字0之外,這兩個數都不會以0開頭。輸入 l1 2,4,3 l2 5,6,4 輸出 7,0,8 解釋 342 465 8...
LeetCode題解002 兩數相加
給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字 如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和 您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭 輸入 2 4 3 5 6 4 輸出 7 0...