两数相加 II-c语言链表

两数相加 II-c语言链表

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

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

示例1:
在这里插入图片描述

输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]

示例2:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[8,0,7]

示例3:

输入:l1 = [0], l2 = [0]
输出:[0]
解题代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* reverse(struct ListNode* l){
    struct ListNode* s=(struct ListNode* )malloc(sizeof(struct ListNode));
    s->next=NULL;
    struct ListNode* p=l;
     while(p){
         l=p;
         p=p->next;
         l->next=s->next;
         s->next=l;
       

     }
     return s->next;

}

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode* n1=reverse(l1);
     struct ListNode* n2=reverse(l2);
      struct ListNode *p1,*p2;
      p1=n1;
      p2=n2;
      int s=0;
     struct ListNode * pre;
     
     while(p1&&p2){

         p1->val=p1->val+p2->val;
         if(s==1){
              p1->val= p1->val+1;
              s=0;
         }
         if(p1->val>=10){
             p1->val=p1->val-10;
             s=1;
         }
         pre=p1;
         p1=p1->next;
         p2=p2->next;
     }
     if(s==1&&p1==NULL&&p2==NULL){
          struct ListNode* sp=(struct ListNode* )malloc(sizeof(struct ListNode));
          sp->val=1;
            pre->next=sp;
            sp->next=NULL;
       
     }
   

     if(p2==NULL&&p1!=NULL&&s==1){
        
          while(p1&&s==1){
                 p1->val=p1->val+1;
                 s=0;
                  if(p1->val>=10){
                  p1->val=p1->val-10;
                   s=1;
                  }
                  pre=p1;
                  p1=p1->next;


             }
             p2=p1;
                if(s==1&&p2==NULL){
             struct ListNode* sp=(struct ListNode* )malloc(sizeof(struct ListNode));
              sp->val=1;
            pre->next=sp;
            sp->next=NULL;
       
     }


     }
     if(p2!=NULL&&p1==NULL){
         pre->next=p2;
        
         if(s==1){
          
             while(p2&&s==1){
                 p2->val=p2->val+1;
                 s=0;
                  if(p2->val>=10){
                  p2->val=p2->val-10;
                   s=1;
                  }
                  pre=p2;
                  p2=p2->next;


             }
              if(s==1&&p2==NULL){
             struct ListNode* sp=(struct ListNode* )malloc(sizeof(struct ListNode));
              sp->val=1;
            pre->next=sp;
            sp->next=NULL;
       
     }

         }
     }
     
     n1=reverse(n1);
     return n1;

}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值