題目介紹
給你兩個(gè) 非空 的鏈表,表示兩個(gè)非負(fù)的整數(shù)。它們每位數(shù)字都是按照 逆序 的方式存儲(chǔ)的,并且每個(gè)節(jié)點(diǎn)只能存儲(chǔ) 一位 數(shù)字。
請(qǐng)你將兩個(gè)數(shù)相加,并以相同形式返回一個(gè)表示和的鏈表。
你可以假設(shè)除了數(shù)字 0 之外,這兩個(gè)數(shù)都不會(huì)以 0 開頭。
示例 1:
輸入:l1 = [2,4,3], l2 = [5,6,4]
輸出:[7,0,8]
解釋:342 + 465 = 807.
示例 2:
輸入:l1 = [0], l2 = [0]
輸出:[0]
示例 3:文章來源:http://www.zghlxwxcb.cn/news/detail-612076.html
輸入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
輸出:[8,9,9,9,0,0,0,1]
提示:文章來源地址http://www.zghlxwxcb.cn/news/detail-612076.html
- 每個(gè)鏈表中的節(jié)點(diǎn)數(shù)在范圍
[1, 100]
內(nèi) 0 <= Node.val <= 9
- 題目數(shù)據(jù)保證列表表示的數(shù)字不含前導(dǎo)零
解答
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
// 注意 [2, 4, 3] 實(shí)際代表數(shù)字是342!!!
// 每一位相加,求得和與進(jìn)位
// 進(jìn)位可加到下一位
// 不同長(zhǎng)度的兩個(gè)數(shù)字,兩個(gè)數(shù)字從低位到高位相加
int n1 = 0, n2 = 0, carry = 0;
int sum = 0;
ListNode *head = nullptr, *tail = nullptr;
// 求得結(jié)果時(shí)用尾插
while(l1 || l2)
{
n1 = l1 ? l1->val : 0;
n2 = l2 ? l2->val : 0;
sum = n1 + n2 + carry;
if(!head) // 結(jié)果鏈表為空
{
head = new ListNode(sum % 10);
tail = head;
}
else // 結(jié)果計(jì)算時(shí)尾插
{
tail->next = new ListNode(sum % 10);
tail = tail->next;
}
carry = sum / 10;
// 若兩個(gè)數(shù)的鏈表中有到達(dá) nullptr 就不用再向后移動(dòng)了
if(l1)
{
l1 = l1->next;
}
if(l2)
{
l2 = l2->next;
}
sum = 0;
}
if(carry > 0) // 最后有進(jìn)位還得加上新的1
{
tail->next = new ListNode(carry);
tail = tail->next;
}
return head;
}
};
到了這里,關(guān)于2. 兩數(shù)相加的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!