代碼測試已過
題目:
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
算法思想:先求出對應的數字之和,最後
處理進位
代碼如下:
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* i = l1, * j = l2;
while (i != nullptr && j != nullptr) // 判斷判定兩個鏈表的長度
{
i = i->next;
j = j->next;
}
// 指向較長的那個鏈表
ListNode* listTable = (i == nullptr) ? l2 : l1;
ListNode* p = listTable; // 用於處理數據
j = (i == nullptr) ? l1 : l2; // 較短的那個鏈表
while (j != nullptr)
{
p->val += j->val; // 兩個鏈表相加
p = p->next;
j = j->next;
}
p = listTable;
int flag = 0;
while (p != nullptr) // 處理進位
{
int k = p->val;
p->val = (p->val + flag) % 10;
flag = (flag + k) / 10;
// 判斷鏈表最後的可能性,進位則開闢一個結點
if (p->next == nullptr && flag != 0)
{
ListNode* tmp = new ListNode(flag);
tmp->next = nullptr;
p->next = tmp;
break;
}
p = p->next;
}
return listTable;
}
};
測試代碼:
ListNode* l1 = new ListNode(5);
ListNode* l2 = new ListNode(5);
l2->next = new ListNode(9);
ListNode* tmp = (new Solution())->addTwoNumbers(l1, l2);
while (tmp != nullptr)
{
cout << tmp->val << endl;
tmp = tmp->next;
}
效果如下: