两个栈中数字相加实现两个数的加法

题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
代码

struct ListNode {
   int val;
   struct ListNode *next;
};
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode *L,*s,*s1,*s2,*p;
    int j=0;
    s1=l1,s2=l2;
    L=(struct ListNode*)malloc(sizeof(struct ListNode));
    L->next=NULL;
    p=L;
    while(s1->next!=NULL&&s2->next!=NULL)
    {
        s=(struct ListNode*)malloc(sizeof(struct ListNode));
        s->val=(s1->val+s2->val+j)%10;
        if((s1->val+s2->val+j)>9)
            j=1;
        else
            j=0;
        p->next=s;
        p=s;
        s1=s1->next;
        s2=s2->next;
    }
    s=(struct ListNode*)malloc(sizeof(struct ListNode));
    s->val=(s1->val+s2->val+j)%10;
    if((s1->val+s2->val+j)>9)
        j=1;
    else
        j=0;
    p->next=s;
    p=s;
    if(s1->next==NULL&&s2->next==NULL)
    {
        if(j==1)
        {
            s=(struct ListNode*)malloc(sizeof(struct ListNode));
            s->val=1;
            p->next=s;
            p=s;
        }
    }
    else if(s1->next==NULL&&s2->next!=NULL)
    {
        s2=s2->next;
        while(s2->next!=NULL)
        {
            s=(struct ListNode*)malloc(sizeof(struct ListNode));
            s->val=(s2->val+j)%10;
            p->next=s;
            p=s;
            if((s2->val+j)>9)
                j=1;
            else
                j=0;
            s2=s2->next;
        }
        s=(struct ListNode*)malloc(sizeof(struct ListNode));
        s->val=(s2->val+j)%10;
        p->next=s;
        p=s;
        if((s2->val+j)>9)
        {
            s=(struct ListNode*)malloc(sizeof(struct ListNode));
            s->val=1;
            p->next=s;
            p=s;
        }   
    }
   else if(s2->next==NULL&&s1->next!=NULL)
    {
        s1=s1->next;
        while(s1->next!=NULL)
        {
            s=(struct ListNode*)malloc(sizeof(struct ListNode));
            s->val=(s1->val+j)%10;
            p->next=s;
            p=s;
            if((s1->val+j)>9)
                j=1;
            else
                j=0;
            s1=s1->next;
        }
        s=(struct ListNode*)malloc(sizeof(struct ListNode));
        s->val=(s1->val+j)%10;
        p->next=s;
        p=s;
        if((s1->val+j)>9)
        {
            s=(struct ListNode*)malloc(sizeof(struct ListNode));
            s->val=1;
            p->next=s;
            p=s;
        }   
    }
    p->next=NULL;
    return L->next;
}

简化

struct ListNode {
    int val;
    struct ListNode *next;
};
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    int c=0;
    struct ListNode *head,*cur,*s;
    head=(struct ListNode *)malloc(sizeof(struct ListNode));
    head->next=NULL;
    cur=head;
    while(l1!=NULL||l2!=NULL||c)
    {
        s=(struct ListNode *)malloc(sizeof(struct ListNode));
        s->next=NULL;
        cur->next=s;
        cur=s;
        l1!=NULL?(c+=l1->val,l1=l1->next):(c+=0);
        l2!=NULL?(c+=l2->val,l2=l2->next):(c+=0);
        cur->val=c%10;
        c=c/10;
    }
    struct ListNode *del=head;
    head=head->next;
    free(del);
    return head;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值