力扣刷题总结--------两数相加

描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

 

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

 

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

 

示例:

 

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:7 -> 0 -> 8

原因:342 + 465 = 807

代码

 

int qcd(struct ListNode* l) {

int len = 1;

if (l == NULL)

{

len = 0;

}

else

{

while (l->next != NULL)

{

len++;

l = l->next;

}

}

 

return len;

}

 

 

void sumtolinklist(struct ListNode** l1, struct ListNode** l2, struct ListNode** l3, int flag, int jw)

{

int dig = 0;

 

if ((*l1) == NULL)

{

if (flag <= 1)//说明l1长

{

if (jw == 1)

{

(*l3) = (struct ListNode*)malloc(sizeof(struct ListNode));

(*l3)->val = 1;

(*l3)->next = NULL;

return;

}

return;

}

if ((*l2) != NULL)//说明l2还没到 就用l2的与进位相加

{

(*l3) = (struct ListNode*)malloc(sizeof(struct ListNode));

(*l3)->next = NULL;

dig += (*l2)->val + jw;

if (dig > 9)

{

jw = 1;

dig = dig % 10;

}

else

{

jw = 0;

}

(*l3)->val = dig;

sumtolinklist(&(*l1), &(*l2)->next, &(*l3)->next, flag, jw);

}

else//最长的也到头了 看进位

{

if (jw == 1)

{

(*l3) = (struct ListNode*)malloc(sizeof(struct ListNode));

(*l3)->next = NULL;

(*l3)->val = 1;

 

return;

}

return;

}

}

if ((*l2) == NULL)

{

if (flag == 2)//说明l2长

{

return;

}

if ((*l1) != NULL)//说明l1还没到 就用l2的与进位相加

{

(*l3) = (struct ListNode*)malloc(sizeof(struct ListNode));

(*l3)->next = NULL;

dig += (*l1)->val + jw;

if (dig > 9)

{

jw = 1;

dig = dig % 10;

}

else

{

jw = 0;

}

(*l3)->val = dig;

sumtolinklist(&(*l1)->next, &(*l2), &(*l3)->next, flag, jw);

}

else//最长的也到头了 看进位

{

if (jw == 1)

{

(*l3) = (struct ListNode*)malloc(sizeof(struct ListNode));

(*l3)->val = 1;

(*l3)->next = NULL;

return;

}

(*l3)->next = NULL;

return;

}

}

if ((*l2) != NULL && (*l1) != NULL)

{

(*l3) = (struct ListNode*)malloc(sizeof(struct ListNode));

(*l3)->next = NULL;

dig = (*l1)->val + (*l2)->val + jw;

if (dig > 9)

{

jw = 1;

dig = dig % 10;

}

else

{

jw = 0;

}

(*l3)->val = dig;

 

sumtolinklist(&(*l1)->next, &(*l2)->next, &(*l3)->next, flag, jw);

 

return;

}

}

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {

double len1, len2;

    int len3;

struct ListNode* e1 = l1;

struct ListNode* e2 = l2;

 

len1 = qcd(e1);

len2 = qcd(e2);

len3 = len1 > len2 ? 0 : 2;

if (len1 == len2)

{

len3 = 1;

}

struct ListNode* mylinklist2;

//mylinklist2 = (struct ListNode*)malloc(sizeof(struct ListNode));

 

sumtolinklist(&l1, &l2, &mylinklist2, len3, 0);

 

return mylinklist2;

}

 

 

 

总结

首先第一次写的时候没注意到大数情况,可能给的数会大于所有的类型上限,比如99999999999999999999999999999999999999999999999999999999999999999999

这玩意就没法计算了,第一次写是先计算总和,可谓是傻逼了一把

 

第二次写的时候是按照每个对应的链表节点进行相加,如果得到的和大于10(进位)

就将进位标志位置1,否则0,在下次相加时要直接加上进位的数值(因为0的话相当于没加),然后再判断和。  而整体的相加过程是采用递归的方法进行的,一般就是按照刚才说的相加,然后置标志位,将链表的next递归到下一层。当某个链表先到低时,要知道这两个链表的长度关系,一般来说这种事要放到递归外进行(我的想法),所以我在外面的函数里对比了两者的长度关系,然后将这个关系传入进去,在递归时需要用到就直接查询,一般来说这样就OK了,但是我测试的时候出现了链表多了一个节点的情况,这个解决方法就是  只有在需要的时候malloc一下,然后紧接着将next置NULL,这样就解决了。相对来说这个题还是挺简单的

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值