代码测试已过
题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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;
}
效果如下: