本文章是對leetcode #2 兩數相加的經驗總結。
題目如下:
給定兩個非空鍊錶來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回乙個新的鍊錶。
你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。
示例:
輸入:[2,4,3]
[5,6,4]
輸出:
[7,0,8]
原因:342 + 465 = 807
/**
* definition for singly-linked list.
* struct listnode ;
*/typedef
struct listnode linklist;
struct listnode*
addtwonumbers
(struct listnode* l1,
struct listnode* l2)
else
pre->next =
null
; tmp = l1val + l2val + carry;
if(tmp >9)
pre->val = tmp;
if(l1->next ==
null
&& l2->next ==
null
)break;if
(l1->next !=
null
)else
l1val =0;
if(l2->next !=
null
)else
l2val =0;
}return l3;
}
題目輸入兩個單鏈表:l1
和l2
,我的思路是從頭開始逐項相加,如果得到的和是兩位數,則將進製放入carry
中。
這次嘗試的問題是:我設定了進製,但在判定逐項相加是否結束(即兩個鍊錶的下一項是否都為空)的時候直接退出迴圈,而沒有把進製再放上去,導致某些測試用例的輸出缺少了最後一位。
發覺上面提到的問題後,我把判定移到了檢查進製carry
是否為0之後:如果是,則判斷;如果不是,則跳過判斷。
/**
* definition for singly-linked list.
* struct listnode ;
*/typedef
struct listnode linklist;
struct listnode*
addtwonumbers
(struct listnode* l1,
struct listnode* l2)
else
pre->next =
null
; tmp = l1val + l2val + carry;
carry =0;
if(tmp >9)
pre->val = tmp;
if(carry ==0)
if(l1->next ==
null
&& l2->next ==
null
)break;if
(l1->next !=
null
)else
l1val =0;
if(l2->next !=
null
)else
l2val =0;
}return l3;
}
這次的**跑到了28ms,第二快,但是第二快的**是最多的。
提供一些測試用例:
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 的範圍內,我們計算...