两数相加 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;
}