[2. 两数相加 - 力扣(LeetCode)](https://leetcode-cn.com/problems/add-two-numbers/)
我整体思路需要相加。这导致精度出现问题。但不管精度,先把这个最容易想到的方法实现了。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
int index = 1;
int idx = 0;
int sum1 = 0, sum2 = 0;
int sum = 0;
int count = 0;
int tmp = 0;
int i = 0;
int *res = NULL;
struct ListNode *resNode = NULL, *cur = NULL;
for(cur = l1; cur != NULL; cur = cur->next){
sum1 += cur->val * index;
index *= 10;
}
printf("%d ",sum1);
index = 1;
for(cur = l2; cur != NULL; cur = cur->next){
sum2 += cur->val * index;
index *= 10;
}
printf("%d ",sum2);
sum = sum1 + sum2;
tmp = sum;
while(tmp > 0){
count += 1;
tmp /= 10;
}
printf("%d ",count);
tmp = sum;
printf("%d ",sum);
res = (int*)malloc(sizeof(int) * count);
resNode = (struct ListNode*)malloc(sizeof(struct ListNode) * count);
count = 0;
while(tmp > 0){
res[count] = tmp % 10;
count += 1;
tmp /= 10;
}
for(i = 0; i< count; i++){
printf("%d ",res[i]);
}
idx = 0;
while(idx < count){
resNode->val = res[idx];
resNode = resNode->next;
}
return resNode;
}
这个就错的很离谱,关于链表的理解都不对。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
unsigned long long index = 1;
int idx = 0;
unsigned long long sum1 = 0, sum2 = 0;
unsigned long long sum = 0;
int count = 0;
int tmp = 0;
int i = 0;
int *res = NULL;
struct ListNode *head = NULL, *cur = NULL, *p = NULL, *tail = NULL;
for(p = l1; p != NULL; p = p->next){
sum1 += p->val * index;
index *= 10;
}
printf("sum1: %d \n",sum1);
index = 1;
for(p = l2; p != NULL; p = p->next){
sum2 += p->val * index;
index *= 10;
}
printf("sum2: %d \n",sum2);
sum = sum1 + sum2;
tmp = sum;
while(tmp > 0){
count += 1;
tmp /= 10;
}
printf("count: %d \n",count);
tmp = sum;
printf("sum: %d \n",sum);
res = (int*)malloc(sizeof(int) * count);
count = 0;
while(tmp > 0){
res[count] = tmp % 10;
count += 1;
tmp /= 10;
}
for(i = 0; i < count; i++){
printf("res[%d]: %d \n",i, res[i]);
}
idx = 0;
while(idx < count){
cur = (struct ListNode*)malloc(sizeof(struct ListNode));
if(head == NULL)
head = cur;
else
tail->next = cur;
cur->val = res[idx];
tail = cur;
printf("val: %d \n",cur->val);
idx += 1;
}
if(tail != NULL)
tail->next = NULL;
if(head == NULL){
head = (struct ListNode*)malloc(sizeof(struct ListNode));
head->val = 0;
head ->next = NULL;
}
for(p = head; p != NULL; p = p->next){
printf("val: %d \n",p->val);
}
return head;
}
这个代码 通过测试用例:792 / 1568
注意是无头节点的尾插法,主要是错在这里。如果最后一个节点不写next为NULL就会狠狠报错。
如果是0就是空链表了。所以写了个特例if(head == NULL)那部分。
无头节点的尾插法就是设置3个指针,head,cur,tail。cur就是动态生成的空间,tail永远指向最后一个节点空间。一开始让head指向cur,后面就没head的事了。
参考[LeetCode - 2.两数相加_许博文的专栏-CSDN博客](https://blog.csdn.net/xbw12138/article/details/85656593)
[(接上篇)c语言单链表的建立之无头节点尾插法与链表的逆置(头插法与就地逆置)_CSDNGuoYuying的博客-CSDN博客_尾插法逆置单链表c](https://blog.csdn.net/CSDNGuoYuying/article/details/86560529)