循环合并K分类的链表

时间:2019-08-08 02:36:41

标签: c++ sorting pointers merge

我的合并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;

有人可以给我任何提示吗?

1 个答案:

答案 0 :(得分:1)

您的mergeTwoLists似乎修改了传递给它的两个列表,以使它们可以从共享列表中出来。如果您确保将其中一个放在一边,再也不要使用它,那么这将不是问题(至少不是 big 问题)。

很明显,这就是您在mergeKLists中使用索引杂凑的目的,但是有一个错误:您错误地增加了i。您可以重用不应使用的列表,在共享一个节点的两个列表上调用mergeTwoLists,它会在列表中创建循环并永远进行迭代。

快速解决方案是修复mergeKLists中的索引算法。更深层次的解决方案是更加小心mergeTwoLists中的指针,以使两个不相交的列表不相交。