给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6-> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
分析
条件:两个链表 每个节点储存一位数字 逆序即链表首为数的个位,链表尾储存数的高位。
状况:
一、进位
既然是加法,自然必须考虑 进位
1.除了两个链表对应位相加,还需要考虑低位产生的进位8->3 + 2->1 (38+12=50) 0->5
2.相加结果,可能需要为进位创建一个节点 例如 2->5 +1->5 (52+51=103) 3->0->1 )
实现:1.我们可以靠相加结果的与10 相除和取余 得到进位和本位
2.在将两链表遍历并完成相加后,若进位存在 ,即进位不为0。则为进位创建一个节点
二、遍历
L1 和L2 的长度
1 两链表相等
2 两链表不相等
不想等意味着一短一长 先遍历两个链表,长度为短的部分 再遍历长链表剩下的部分
实现:
代码
/**
* 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) {
// carry表进位 bits表本位
int carry=0,bits=0;
// head为新链表的头结点
//newNode指向每次新建结点的地址
//tag标记当前链表尾部
ListNode*head,*newNode,*tag;
bool flag=true;
ListNode *p=l1,*q=l2;
//遍历 两个链表中短的部分
for(;p&&q;p=p->next,q=q->next){
bits=q->val+p->val+carry;
carry=bits/10;
bits=bits%10;
newNode= new ListNode(bits);
if(flag){
head=newNode;
tag=head;
flag=false;
}else{
tag->next=newNode;
tag=newNode;
}
}
//两链表长度相等
if(!p&&!q)
{
//考虑两链表最高位产生的进位
if(carry){
newNode= new ListNode(carry);
tag->next=newNode;
tag=newNode;
}
}
//遍历长链表剩余的部分
else{
//p标记的为L1的剩余部分,p为空则剩余L2(q标记L2剩余部分)
if(!p)
p=q;
for(ListNode*f=p; f ; f=f->next)
{
bits=f->val+carry;
carry=bits/10;
bits=bits%10;
newNode= new ListNode(bits);
if(flag){
head=newNode;
tag=head;
flag=false;
}
else{
tag->next=newNode;
tag=newNode;
}
}
//考虑两链表最高位产生的进位
if(carry){
newNode= new ListNode(carry);
tag->next=newNode;
tag=newNode;
}
}
return head;
}
};