描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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,这样就解决了。相对来说这个题还是挺简单的