给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 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) {
int carry = 0,bits = 0; // carry表进位 bits表本位
ListNode *head; //head为新链表的头结点
ListNode *newNode; //newNode指向每次新建结点的地址
ListNode *tag; //tag标记当前链表尾部
bool flag = true;
//遍历 两个链表中短的部分
for(ListNode *p = l1,*q = l2; 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 =b its/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;
}
};