使用O(1)空间复杂度对O(n log n)中的链表进行排序

时间:2014-10-17 14:58:26

标签: java algorithm sorting linked-list time-complexity

这是LeetCode https://oj.leetcode.com/problems/sort-list/上的排序列表问题 我制作了一个Java解决方案,但它在极长的测试用例中导致超出时间限制。我无法在代码中找到错误。谁能指出这个bug在哪里?非常感谢。

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
        next = null;
    }
}

public class Solution {
    public ListNode sortList(ListNode head) {
        return this.sortPart(head, null);
    }

    private ListNode sortPart(ListNode start, ListNode end){
        if(start == null)return null;
        if(start == end)return start; 

        ListNode l=start, r=start, p=start.next;

        while(p!= null && p!=end){
            if(p.val < start.val){ // current node less than start node
                r.next = p.next;
                p.next = l;
                l = p; // set current node as leftmost
                p = start.next; // go to next node
            }else{ // current node no less more start node
                r = p; // set current node as rightmost and go to next node
                p = p.next; 
            }
        }

        // recursively sort left part and right part
        sortPart(l,start);
        sortPart(start.next, r);

        return l;
    }
}

2 个答案:

答案 0 :(得分:5)

错误可能是已经排序的列表上的快速排序是O(n*n)。一个实际的解决方案是随机选择枢轴。标准的在线油藏采样算法解决了这个问题。

然而,这仍然可能不够好。 Quicksort将创建一个O(log(n))次调用的callstack,因此占用O(log(n))空间。如果他们设置了足够好的测试,他们应该能够验证你已经过去了。

要获得真正的解决方案,请参阅http://comjnl.oxfordjournals.org/content/35/6/643.full.pdf

鉴于有多少人通过了这个问题,我怀疑他们没有准确地发现O(log(n))空间和O(1)空间之间的区别。

答案 1 :(得分:0)

我不知道你为什么要快速排序......最糟糕的情况是O(n * n)......你在寻找的是 堆排序  O(n + n * log(n))eqiv。到O(nlog(n))并且空间复杂度为O(1)