题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
代码和思路
- 同时遍历两个链表,并逐个相加,如果相加后产生进位,就将进位结果保存在一个变量中,比如代码中的变量forword,在循环的下一次迭代中将进位结果和两个链表的下一个节点相加
- 如果一个链表遍历完成,但另一个链表还没有完成(即两个链表不一样长),那就需要单独遍历更长链表的剩余节点。
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode * p1 = l1, *p2 = l2, *p3 = NULL;
struct ListNode * retNode = NULL, *newNode = NULL, *oldNode = NULL;
int forword = 0, sum;
while(p1 != NULL && p2 != NULL){
newNode = (struct ListNode * )malloc(sizeof(struct ListNode));
sum = p1->val + p2->val + forword;
newNode->val = sum%10;
forword = sum/10;
newNode->next = NULL;
p1 = p1->next; p2 = p2->next;
if(retNode == NULL){
retNode = newNode;
oldNode = newNode;
}else{
oldNode->next = newNode;
oldNode = newNode;
}
}
if(p1 != NULL)
p3 = p1;
else
p3 = p2;
while(p3 != NULL){
sum = forword + p3->val;
newNode = (struct ListNode * )malloc(sizeof(struct ListNode));
newNode->val = sum%10;
forword = sum/10;
newNode->next = NULL;
p3 = p3->next;
if(retNode == NULL){
retNode = newNode;
oldNode = newNode;
}else{
oldNode->next = newNode;
oldNode = newNode;
}
}
if(forword != 0){
newNode = (struct ListNode * )malloc(sizeof(struct ListNode));
newNode->val = forword;
newNode->next = NULL;
oldNode->next = newNode;
}
return retNode;
}