这是LeetCode中的一个问题,我基本上必须使用链接列表添加两个数字。我对自己所做的事情非常有信心,并且我的代码被接受了他们的默认测试用例。但是,当我点击“提交”时,它不适用于他们的任何测试用例。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode *temp1= l1,*temp2=l2,*temp3=(struct ListNode*)malloc(sizeof(struct ListNode)),*temp4=temp3,*prev;
temp3->val=0;
long long int num1=0,num2=0;
while (temp1!=NULL)
{
num1=num1*(long long int )10 + (long long int )temp1->val;
temp1 = temp1->next;
}
while (temp2!=NULL)
{
num2=num2*10 + temp2->val;
temp2 = temp2->next;
}
long long int num3 = num1+num2;
do
{
temp3->val = (long long int )num3%10;
temp3->next = (struct ListNode*)malloc(sizeof(struct ListNode));
prev=temp3;
temp3 = temp3->next;
num3/=(long long int )10;
} while(num3!=0);
prev->next=NULL;
return temp4;
}
我采用了蛮力方法,只是将两个数字相加。它给了我正确的价值。然后,我创建一个新的链表,在其中保存everu 数字并为补偿最后的多余元素,我分别保存了前一个节点。 最后,我删除了最后一个元素与多余元素的连接。我运行我的代码,并获得正确的输出。 我期望[7,0,8]并得到[7,0,8]
这是回溯:
AddressSanitizer: SEGV on unknown address 0x0000000c7616 (pc 0x0000004019db bp 0x7ffff1366900 sp 0x7ffff13668e0 T0)
关于错误,实际上没有什么地方。这是我能找到的最相似的东西,但是无论如何我一直在使用malloc分配内存,并且使用free(prev-> next)弄乱了所有东西。 link
我也想澄清一下,我并不是在寻找理想的答案,因为我不想作弊,只是找出我在做错什么。
添加do-while循环使我清楚了1563年之后的另外14个测试用例... 出现新错误
Line 17: Char 15: runtime error: signed integer overflow: 399999999 * 10 cannot be represented in type 'int' (solution.c)
第17行是num1 = num1 * 10 + temp1-> val行;我决定将每个int替换为long long int,但是除了清除五个额外的测试用例外,其他没有什么区别。 (我将每个值都强制转换为包含常量的long int类型)
答案 0 :(得分:3)
当prev
为num3
时,我做了一些更改以不取消引用0
指针。
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *temp1= l1,*temp2=l2,*temp3=(struct ListNode*)malloc(sizeof(struct ListNode)),*temp4=temp3;
temp3->val=0;
temp3->next=NULL;
int num1=0,num2=0;
while (temp1!=NULL)
{
num1=num1*10 + temp1->val;
temp1 = temp1->next;
}
while (temp2!=NULL)
{
num2=num2*10 + temp2->val;
temp2 = temp2->next;
}
int num3 = num1+num2;
while(num3!=0)
{
temp3->val = num3%10;
temp3->next = (struct ListNode*)malloc(sizeof(struct ListNode));
temp3->next->next = NULL;
temp3 = temp3->next;
num3/=10;
}
return temp4;
}
基本上,我删除了prev
变量,而不是直接分配NULL
。
当数字的总和为struct ListNode
时,也会发生0
大小的内存泄漏。我让你弄清楚并处理。
但是,如果列表中有更多数字表示的数字将最终使整数int num3 = num1+num2;
溢出,则您的解决方案将无法正常工作。
最后,任务是在适当的位置添加两个列表,而不是从中提取数字并形成整数。