题目描述
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解答思路
就是按位串行加法计算。需要考虑好全加器,即3个输入变量:加数,被加数,进位。三者之和的本位是结果的本位,进位则传递给下一个全加器的进位。最后根据哪个加数剩余的高位比较多,就直接补充其高位。
- 特别注意的点:
- 当其中一个加数的高位不足时候,剩下就是直接另一个加数的高位。
- 需要增加最后一个进位的判断。
代码
- C语言
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
int carry=0;
struct ListNode* p_head = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* p_last = NULL;
while(l1 != NULL && l2 != NULL){
if(p_last == NULL){
p_last = p_head;
}else{
p_last->next = (struct ListNode*)malloc(sizeof(struct ListNode));
p_last = p_last->next;
}
p_last->next = NULL;
p_last->val = (l1->val+l2->val+carry)%10;
carry = (l1->val+l2->val+carry)>=10?1:0;
l1 = l1->next;
l2 = l2->next;
}
while(l1 != NULL){
p_last->next = (struct ListNode*)malloc(sizeof(struct ListNode));
p_last = p_last->next;
p_last->next = NULL;
p_last->val = (l1->val+carry)%10;
carry = (l1->val+carry)>=10?1:0;
l1 = l1->next;
}
while(l2 != NULL){
p_last->next = (struct ListNode*)malloc(sizeof(struct ListNode));
p_last = p_last->next;
p_last->next = NULL;
p_last->val = (l2->val+carry)%10;
carry = (l2->val+carry)>=10?1:0;
l2 = l2->next;
}
if(carry!=0){
p_last->next = (struct ListNode*)malloc(sizeof(struct ListNode));
p_last = p_last->next;
p_last->next = NULL;
p_last->val = 1;
}
return p_head;
}