题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 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;
}