题目描述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
解题思路
思路不复杂,就是将链表每个项相加,如果和大于10,令进位和和分别为count=sum%10,sum=sum/10
,随后的每项和别忘了同时加上count即可。
同时遍历到链表末尾后,可直接将另一个链表的末尾加上去。在对末尾的处理中,可以简化的是,如果进位为0了,可以停止继续对剩余项的遍历。
最后到达末尾的时候,如果进位仍不为0,需要在创建一个新的值为1的节点加在最后面。
实现代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
int count=0;
struct ListNode* l=l1;
struct ListNode* p=l1;
struct ListNode* q=l2;
while (p->next!=NULL&&q->next!=NULL){
p->val=p->val+q->val+count;
count=p->val/10;
p->val=p->val%10;
p=p->next;
q=q->next;
}
p->val+=q->val+count;
count=p->val/10;
p->val=p->val%10;
if(q->next!=NULL){
p->next=q->next;
p=p->next;
while(count!=0&&p->next!=NULL){
p->val+=count;
count=p->val/10;
p->val=p->val%10;
p=p->next;
}
p->val+=count;
count=p->val/10;
p->val=p->val%10;
}else {
while(count!=0&&p->next!=NULL){
p=p->next;
p->val+=count;
count=p->val/10;
p->val=p->val%10;
}
}
if(count==1){
struct ListNode* m=malloc(sizeof(struct ListNode));
m->val=1;
m->next=NULL;
p->next=m;
}
return l;
}