题目:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *p,*p1,*p2,*p3,*p4,*ppp,*pppp;
p3=l1;
p4=l2;
int flag=0,i=0,j=0;
while(p3!=NULL){
i++;
p3=p3->next;
}
while(p4!=NULL){
j++;
p4=p4->next;
}
if(i==j||i>j){
p=l1;
p1=ppp=l1;
p2=pppp=l2;
}
if(i<j){
p=l2;
p2=ppp=l2;
p1=pppp=l1;
}
while(ppp!=NULL&&pppp!=NULL){
if((ppp->val+pppp->val+flag)/10>0){
int k=ppp->val;
ppp->val=(ppp->val+pppp->val+flag)%10;
flag=(k+pppp->val+flag)/10;
if(i==j||i>j){
p1=ppp;
p2=pppp;
}
if(i<j){
p2=ppp;
p1=pppp;
}
ppp=ppp->next;
pppp=pppp->next;
}else{
ppp->val=ppp->val+pppp->val+flag;
if(i==j||i>j){
p1=ppp;
p2=pppp;
}
if(i<j){
p2=ppp;
p1=pppp;
}
ppp=ppp->next;
pppp=pppp->next;
flag=0;
}
}
if(ppp!=NULL&&flag!=0){
while(ppp!=NULL){
if((ppp->val+flag)/10){
flag=(ppp->val+flag)/10;
ppp->val=(ppp->val+flag)%10;
if(i==j||i>j){
p1=ppp;
p2=pppp;
}
if(i<j){
p2=ppp;
p1=pppp;
}
ppp=ppp->next;
}else{
ppp->val=ppp->val+flag;
flag=0;
if(i==j||i>j){
p1=ppp;
p2=pppp;
}
if(i<j){
p2=ppp;
p1=pppp;
}
ppp=ppp->next;
}
}
}
if(ppp==NULL&&pppp==NULL&&flag!=0){
struct ListNode* pp = (struct ListNode*)malloc(sizeof(struct ListNode));
pp->val=flag;
pp->next=NULL;
if(i==j||i>j)
p1->next=pp;
if(i<j)
p2->next=pp;
}
return p;
}
如有错误请指正,谢谢!!!