【发布时间】:2022-01-15 10:02:47
【问题描述】:
我正在尝试使用非递归解决方案解决 leetcode 上的合并 k 排序列表问题。当我运行代码时,它会给出如下所述的错误。你能帮我解决问题吗? 错误在列表[min_idx] = lists[min_idx]->next;
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize){
struct ListNode *result;
result = (struct ListNode *)malloc(sizeof(struct ListNode));
result = NULL;
struct ListNode *p;
if (!listsSize){
return result;
}
int min = INT_MAX;
int min_idx = 0;
int cnt=0;
while (lists){
for ( int i = 0 ; i<listsSize ; i++){
if (lists[i]){
cnt=0;
if (lists[i]->val < min){
min = lists[i]->val;
min_idx = i;
}
}
else {
cnt++;
}
}
if (cnt==listsSize){
break;
}
struct ListNode *temp;
temp = (struct ListNode *)malloc(sizeof(struct ListNode));
temp->val = min;
temp->next = NULL;
if (result == NULL){
result = temp;
p = temp;
}
else {
p->next = temp;
p = p->next;
}
lists[min_idx] = lists[min_idx]->next;
}
return result;
}
错误:
Line 52: Char 40: runtime error: member access within null pointer of type 'struct ListNode' [solution.c].
【问题讨论】:
-
您应该使用调试器并找到程序崩溃的位置。
-
第 52 行在哪里?
-
在取消引用之前,您不会检查
temp是否拥有有效地址。 -
result = (struct ListNode *)...您对result的第一次分配是无用的,并且在您之后立即将其设置为NULL时也会导致内存泄漏。同样在 C 中,您不需要区分malloc的结果 -
如果结果创建后没有设置为null,leetcode编译器显示运行时错误为SEGV未知地址...
标签: c merge linked-list singly-linked-list function-definition