https://leetcode.cn/problems/add-two-numbers/
一开始我的思路是分别求出两个链表表示的数,相加后再按要求存到链表中,也通过了测试用例,但是这有一个致命的错误就是 int 甚至 long long int 都无法表示十进制100位的数。以下是错误代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *p, *q, *s, *r;
int a=0, b=0, i, sum;
struct ListNode* SUM = (struct ListNode*)malloc(sizeof(struct ListNode));
for(i=1, p=l1; p!=NULL; p=p->next){
a += p->val * i;
i *= 10;
}
for(i=1, q=l2; q!=NULL; q=q->next){
b += q->val * i;
i *= 10;
}
sum = a + b;
SUM->val = sum % 10;
SUM->next = NULL;
sum = sum / 10;
for(r=SUM; sum>0; r=s){
s = (struct ListNode*)malloc(sizeof(struct ListNode));
s->val = sum % 10;
sum = sum / 10;
r->next = s;
s->next = NULL;
}
return SUM;
}
后来意识到上面的错误,我发现只能把两个链表每位相加,一位一位地存到返回的链表中,每一位是两链表数字之和(注意链表为空时取0)+进位值(1或0),存储使用尾插法。注意按照我的方法,最后一位如果有进位,直接存1,若无进位,需要把这个已经 malloc 的结点 free 掉,如果一开始把 tail->next 当作 tail 用就没事,本质一样。以下是正确代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode)); //初始化返回的链表
struct ListNode* tail = head;
struct ListNode* f = NULL;
int carry = 0; //初始化进位,0或1
while(l1||l2){
int n1 = l1 ? l1->val : 0; //读l1这一位的值,空时取0
int n2 = l2 ? l2->val : 0;
int sum = n1 + n2 + carry;
int r = sum % 10; //应该填入返回链表的值
carry = sum / 10; //进位为1或0
tail->val = r; //存储
tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
f = tail;
tail = tail->next;
tail->next = NULL;
if(l1) l1 = l1->next; //下一位
if(l2) l2 = l2->next;
}
if(carry){ //解决最高位进位问题
tail->val = 1;
}
else{
f->next = tail->next;
free(tail);
}
return head;
}