#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;
}
leetcode2两数相加(C语言版)
猜你喜欢
转载自blog.csdn.net/weixin_43176384/article/details/86481172
今日推荐
周排行