给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ad… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例:
输出: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:
bool add = false;
int sum = 0;
void cus_add(int v1,int v2){
//2数相加和为sum,并更新进位状态
sum = v1+v2;
if(add) sum++;
if(sum>=10){
sum = sum-10;
add = true;
}else add=false;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if(!l2){
return l1;
}
else if(!l1){
return l2;
}
ListNode* p = l1;
ListNode* pr = l1;
while(l1 !=NULL && l2 !=NULL){
//l1 l2 都有数据时相加
cus_add(l1->val,l2->val);
l1->val=sum;
pr=l1;
l1=l1->next;
l2=l2->next;
}
//l1 l2 其中一个没有数据或都没有数据时
while(l2){
// l2 有数据而l1 无数据, l2有数据 l1必然没有数据
pr->next = new ListNode(l2->val);
cus_add(l2->val,0);
pr->next->val=sum;
pr=pr->next;
l2=l2->next;
}
// l1 有数据 l2无数据
while(l1){
cus_add(l1->val,0);
l1->val=sum;
pr=l1;
l1=l1->next;
}
//l1不存在,l2不存在,解决两种情况
//1 上述l1 l2 只有一个不存在时,计算完毕后仍有进位
//2 l1 l2 不存在 有进位
if(!l1 && !l2 && add){
pr->next = new ListNode(1);
}
return p ;
}
};
思路
因为两个链表恰好是倒序排列,首位即为个位,所以按顺序读并相加即可。 设置进位标志++add++,有进位则为true,注意当使用完进位标志后(两数相加时使用上一位的进位时)要将add置为false。 相加运算会多次使用,所以将这部分操作写成独立的函数。
//2数相加和为sum,并更新进位状态
sum = v1+v2;
if(add) sum++;
if(sum>=10){
sum = sum-10;
add = true;
}else add=false;
}
两个链表: 1,可能都是空的 2,其中一个时空的 3,其中一个的位数远远大于另一个 所以算法也分三步
if(!l2){
return l1;
}
else if(!l1){
return l2;
}
检测l1 l2 是否是空的
while(l1 !=NULL && l2 !=NULL){
//l1 l2 都有数据时相加
cus_add(l1->val,l2->val);
l1->val=sum;
pr=l1;
l1=l1->next;
l2=l2->next;
}
l1 l2 都有数据时调用加法函数相加即可,这里将计算结果存到了l1 指针。 pr指向l1的上一个节点,作用是l1为空时依然可以向l1添加节点保存计算结果。
while(l2){
// l2 有数据而l1 无数据, l2有数据 l1必然没有数据
pr->next = new ListNode(l2->val);
cus_add(l2->val,0);
pr->next->val=sum;
pr=pr->next;
l2=l2->next;
}
先判断其中一个链表先没有数据的情况。 l1无数据计为0,调用加法函数,加法函数计算时会自动考虑进位。 l2无数据,l1有数据原理相同。
最后判断双方都没有数据的情况。因为只有一个有数据时,计算到最后也是双方都没有数据的情况,所以放到最后处理。
//1 上述l1 l2 只有一个不存在时,计算完毕后仍有进位
//2 l1 l2 不存在 有进位
if(!l1 && !l2 && add){
pr->next = new ListNode(1);
}
2020/1/8 小剑