GitHub-LT-02-源码 :large_blue_diamond:加法进位
问题描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
解法:
- 执行用时:24 ms, 在所有 C++ 提交中击败了98.64%的用户
- 内存消耗:9.3 MB, 在所有 C++ 提交中击败了100.00%的用户
算法复杂度
O(n)
取决于链表中较长的
class Solution
{
public:
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2)
{
//* 本质就是两数两加,不用管链表的倒序
//* 使用头指针
ListNode preHead(0), *p = &preHead; //* 链表的头节点
int tempSum = 0; //* 临时保存两数之和
while (l1 || l2 || tempSum)//* 或tempSum 是因为可能最高位产生进位,此时需要再建一个ListNode
{
//* 求两数之和
if (l1)
tempSum += l1->val, l1 = l1->next;
if (l2)
tempSum += l2->val, l2 = l2->next;
p->next = new ListNode(tempSum % 10); //* 余数作为结果值
tempSum /= 10; //* 进位
p = p->next;
}
return preHead.next;
}
};