问题描述:
- 给定两个非空链表
l1
和 l2
来代表两个非负整数,将链表代表的数相加再以链表的形式返回。
- 数字最高位位于链表头部。
- 每个节点只存储一位数字。
- 无前导零。
核心思路:
- 该题类似于剑指 offer Ⅱ 002 二进制加法,只是因为是链表形式无法直接从后往前访问,所以需要先反转链表。
- 步骤很直观,因为高位处于链表前面,所以需要先反转两个链表使得低位在前,加法从低位加起,同时用变量
carry
记录进位。 - 接着在遍历过程中从后往前构造相加之后的链表即可。
代码实现:
class Solution
{
private:
void reverseList(ListNode*& l)
{
ListNode* pre = nullptr;
ListNode* cur = l;
ListNode* next;
while(cur)
{
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
l = pre;
}
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
reverseList(l1); reverseList(l2);
ListNode* next = nullptr;
int carry = 0;
while(l1 or l2)
{
int num1 = l1 ? l1->val : 0;
int num2 = l2 ? l2->val : 0;
int sum = num1 + num2 + carry;
carry = sum / 10;
sum %= 10;
ListNode* cur = new ListNode(sum, next);
next = cur;
if(l1) l1 = l1->next;
if(l2) l2 = l2->next;
}
if(carry == 1)
{
ListNode* cur = new ListNode(1, next);
next = cur;
}
return next;
}
};