我的合并k排序列表算法使用分而治之,并在过程中利用合并2列表算法作为辅助工具。
问题在于,在迭代过程中会创建一个循环,但我不知道为什么。
我将代码追溯到发生此情况的确切位置,但是我仍然无法识别问题。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2, bool debug=false)
{
ListNode *head = new ListNode(-1);
ListNode *curr = head;
while(l1 && l2)
{
if(l1->val <= l2->val)
{
curr->next = l1;
l1 = l1->next;
}
else
{
curr->next = l2;
l2 = l2->next;
}
curr = curr->next;
}
// some list may be still populated
l1 != NULL ? curr->next = l1 : curr->next = l2;
return head->next;
}
ListNode* mergeKLists(std::vector<ListNode*>& lists)
{
// approach of divide and conquer
int size = lists.size();
int interval = 1;
int tmp_val = 1;
bool debug= false;
while(interval < size)
{
for(int i=0; i<size-interval; i*=2)
{
lists[i] = mergeTwoLists(lists[i], lists[i+interval], debug=debug);
if (i==0)
i++;
}
interval*=2;
}
if (size)
return lists[0];
else
{
ListNode* ret=NULL;
return ret;
}
}
};
由于某种原因,此输入[[-10,-9,-9,-3,-1,-1,0],[-5],[4],[-8],[],[- 9,-6,-5,-4,-2,2,3],[-3,-3,-2,-1,0]] 引发无限循环。
我在sort 2列表算法的第二个list参数中遇到无限循环。 我相信它会在代码行中的某些迭代中发生:
curr->next = l2;
l2 = l2->next;
有人可以给我任何提示吗?
答案 0 :(得分:1)
您的mergeTwoLists
似乎修改了传递给它的两个列表,以使它们可以从共享列表中出来。如果您确保将其中一个放在一边,再也不要使用它,那么这将不是问题(至少不是 big 问题)。
很明显,这就是您在mergeKLists
中使用索引杂凑的目的,但是有一个错误:您错误地增加了i
。您可以重用不应使用的列表,在共享一个节点的两个列表上调用mergeTwoLists
,它会在列表中创建循环并永远进行迭代。
快速解决方案是修复mergeKLists
中的索引算法。更深层次的解决方案是更加小心mergeTwoLists
中的指针,以使两个不相交的列表不相交。