leetcode2两数相加(C语言版)



#include <stdio.h>

#include<stdlib.h>

 

struct ListNode {

   
int val;

   
struct ListNode *next;

};

 

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

   
struct ListNode *t,*p,*q,*l;

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

   
t->val=0;

   
t->next=NULL;

   
p=l1;

   
q=l2;  //p&q接受l1&l2的位置,故不用malloc也有空间->val,->next

   
l=t;  //l即链表t的头结点

   
while(p!=NULL&&q!=NULL)

    {

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

       
node->val=0;

        node->next=NULL;

       
t->next=node;

       
t->val+=(p->val+q->val);

       
if(t->val>=10)

       
{

           
t->val-=10;

           
node->val=1;

       
}

       
p=p->next;

       
q=q->next;

       
if(p==NULL&&q==NULL&&node->val == 0)  //防止末位多零

           
t->next=NULL;

       
t=t->next;

    }

   
while(p!=NULL)

    {

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

       
node->val=0;

       
node->next=NULL;

       
t->next=node;

       
t->val+=p->val;

        if(t->val>=10)

       
{

           
t->val-=10;

           
node->val=1;

       
}

       
p=p->next;

       
if(p==NULL&&node->val == 0)

           
t->next=NULL;

       
t=t->next;

    }

   
while(q!=NULL)

    {

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

       
node->val=0;

       
node->next=NULL;

       
t->next=node;

       
t->val+=q->val;

       
if(t->val>=10)

       
{

           
t->val-=10;

           
node->val=1;

       
}

       
q=q->next;

       
if(q==NULL&&node->val == 0)

           
t->next=NULL;

       
t=t->next;

    }

   
return l;

}

int main()

{

   
struct ListNode *l1,*l2,*l,*p1,*p2,*t;

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

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

   
l1->val=0;

   
l2->val=0;

   
l1->next=NULL;

   
l2->next=NULL;

   
p1=l1;

   
p2=l2;  //p1&p2仅用来作为头结点记录位置,不用malloc

   
do

    {

       
scanf("%d",&l1->val);

       
l=(struct ListNode*)malloc(sizeof(struct ListNode*));  //每次malloc一个结点,所以放在循环语句中,链表创建基础

       
l->val=0;

       
l->next=NULL;

       
l1->next=l;

       
l1=l1->next;

   
}while(getchar()!='\n');

   
do

    {

       
scanf("%d",&l2->val);

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

       
l->val=0;

       
l->next=NULL;

       
l2->next=l;

       
l2=l2->next;

   
}while(getchar()!='\n');  //防止第一个数字被getchar吞掉

   
t=addTwoNumbers(p1,p2);  //传递头结点位置

   
while(t!=NULL)  //不是t->next!=NULL

    {

       
printf("%d",t->val);

       
t=t->next;

    }

   
return 0;

}


猜你喜欢

转载自blog.csdn.net/weixin_43176384/article/details/86481172