题目描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解题思路和考虑的问题:
思路:设两个工作指针同时移动相加,把值保存在新结点中
问题:
1、进位问题:
设一个count记录进位,由于加法进位最多为1,判断有进位后直接count=1,else count=0;
2、俩个数位数不相等,列:677和87:
在第一次循环后判断哪个数为高位数,再同count相加如新链表
3、两个数所有位数处理完后,还需判断有无进位,列545+555=1000:
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode LNode;
typedef LNode* List;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
if(l1==NULL||l2==NULL)
return NULL;
List head=NULL,p,tempNode; //p为新链表尾插的工作指针,tempNode为建立节点的指针
LNode *p1=l1,*p2=l2; //相加的工作指针
int tempval,count=0; //tempval保存新节点的值 count表进位
while(p1!=NULL&&p2!=NULL){
tempval=count+p1->val+p2->val;
if(tempval>=10){ //判断是否有进位
count=1;
tempval=tempval%10;
}
else
count=0;
tempNode=(List)malloc(sizeof(LNode));
tempNode->val=tempval;
if(head==NULL){ //无头结点的尾插法第一次插入略有不同
head=tempNode;
p=tempNode;
}
else{
p->next=tempNode;
p=p->next;
}
p1=p1->next;
p2=p2->next;
}
while(p1!=NULL){ //当l1位数比l2高
tempval=count+p1->val;
if(tempval>=10){
count=1;
tempval=tempval%10;
}
else{
count=0;
}
tempNode=(List)malloc(sizeof(LNode));
tempNode->val=tempval;
p->next=tempNode;
p=p->next;
p1=p1->next;
}
while(p2!=NULL){ //当l2位数比l1高
tempval=count+p2->val;
if(tempval>=10){
count=1;
tempval=tempval%10;
}
else{
count=0;
}
tempNode=(List)malloc(sizeof(LNode));
tempNode->val=tempval;
p->next=tempNode;
p=p->next;
p2=p2->next;
}
if(count!=0){ //当最后一位有进位
tempNode=(List)malloc(sizeof(LNode));
tempNode->val=count;
p->next=tempNode;
p=p->next;
}
p->next=NULL; //尾部置空
return head;
}