题目描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
算法:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if(l1==NULL && l2==NULL)
{
return NULL;
}
int jinwei = 0; //表示每次的进位
ListNode* p1 = l1, * p2 = l2;
queue<int>s; // 使用队列暂时保存对应位相加的和
while(p1 && p2) //两个链表的对应位都不为空
{
int value = p1->val + p2->val + jinwei;
if(value >= 10)
{
jinwei = 1;
s.push(value % 10);
}
else
{
jinwei = 0;
s.push(value);
}
p1 = p1->next;
p2 = p2->next;
}
bool flag1 = false, flag2 = false;
if(p1!=NULL) // 第一个链表较长
{
flag1 = true;
while(p1)
{
int value = p1->val + jinwei;
if(value >= 10)
{
jinwei = 1;
s.push(value % 10);
}
else
{
jinwei = 0;
s.push(value);
}
p1 = p1->next;
}
}
if(p2!=NULL) //第二个链表较长
{
flag2 = true;
while(p2)
{
int value = p2->val + jinwei;
if(value >= 10)
{
jinwei = 1;
s.push(value % 10);
}
else
{
jinwei = 0;
s.push(value);
}
p2 = p2->next;
}
}
if(jinwei > 0) // 如果最高位有进位,则新增一位 1
s.push(jinwei);
//利用现有的链表,不用重新开辟一个新链表了
if(flag1 == true) //链表1 比较长
p1 = l1;
else
p1 = l2;
l1 = p1;
l2 = p1;
while(p1!=NULL)
{
int a = s.front();
p1->val = a;
s.pop();
l2 = p1;
p1 = p1->next;
}
if(!s.empty()) //最高位有进位,则新开辟一个节点,并接到链表后面
{
ListNode * q = new ListNode(0);
q->val = s.front();
l2->next = q;
}
return l1;
}
};