给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
Example:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
Thinking:
因为两条输入链表是逆序,所以可以直接相加,利用进位数标记即可,链结点数值为(L1+L2+进位数)%10, 进位数为(L1+L2+进位数)/10。
在结果最后需要处理两条输入链链尾进位情况。
Code:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *head = nullptr, *trail = nullptr; //最终结果的链头和链尾
int flag = 0; //进位数
while(l1 || l2)
{
int n1 = l1? l1->val : 0;
int n2 = l2? l2->val : 0;
int sum = n1 + n2 + flag;
if(!head) //设置链头
{
head = new ListNode(sum % 10);
trail = head;
}
else //设置链尾
{
trail->next = new ListNode(sum % 10);
trail = trail->next;
}
flag = sum / 10; //设置进位数
if(l1)
l1 = l1->next;
if(l2)
l2 = l2->next;
}
if(flag > 0) //处理两条输入链尾相加进位情况
trail->next = new ListNode(flag);
return head;
}
};