力扣-两数相加

一开始我把这道题复杂化了,我想着通过逆序链表输出两条链表的值,再将两个链表的值相加之后再将这个值储存

但其实问题不用这么麻烦,只需要简单的对同一位置的链表元素相加,当相加结果大于9时再进位就行

需要考虑三种情况:

1.两条链表长度一样:用新节点直接将相加后的值存储起来(考虑进位)

2.两条链表长度不一样:用新节点直接将不等长的节点数值存储起来(考虑进位)

3.合成的数长度比原来两条链表都要大:即进位,直接存1即可

代码如下

/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     struct ListNode *next;

 * };

 */

//写题思路:将两个链表的节点相加,列入新链表中

//若出现进位,则在下一位的节点加一

typedef struct ListNode* list;

typedef struct ListNode node;

list creat(int n,int flag)

{

    list new=malloc(sizeof(node));

    new->val=n;

    new->next=NULL;

    return new;

}


 

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

    list head,p;

    head=creat(0,0);

    p=head;

    int n=0;

    int flag=0;

    while(l1&&l2)//当两条链表都不为空时

    {

        n=l1->val+l2->val+flag;

        if(n>=10)

        {

            n-=10;

            p->next=creat(n,flag);

            p=p->next;

            flag=1;

        }

        else

        {

            p->next=creat(n,flag);

            p=p->next;

            flag=0;

        }

        l1=l1->next;

        l2=l2->next;

       

    }

    while(l1)//若l2空了l1没空

    {

        n=l1->val+flag;

        if(n>=10)

        {

            n-=10;

            p->next=creat(n,flag);

            p=p->next;

            flag=1;

        }

        else

        {

            p->next=creat(n,flag);

            p=p->next;

            flag=0;

        }

        l1=l1->next;

       

    }

    while(l2)//若l1空了l2没空

    {

        n=l2->val+flag;

         if(n>=10)

        {

            n-=10;

            p->next=creat(n,flag);

            p=p->next;

            flag=1;

        }

        else

        {

            p->next=creat(n,flag);

            p=p->next;

            flag=0;

        }

        l2=l2->next;

    }

    if(flag==1)//若l1 l2都空了但是进位了

    {

        p->next=creat(1,0);

        p=p->next;

    }

    return head->next;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值