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

Java 以O(1)空间复杂度对O(n log n)中的链表进行排序,java,algorithm,sorting,linked-list,time-complexity,Java,Algorithm,Sorting,Linked List,Time Complexity,这是LeetCode上的排序列表问题 我制作了一个Java解决方案,但它导致在一个非常长的测试用例上超过了时间限制。我在代码中找不到bug。有人能指出bug在哪里吗?非常感谢 class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; } } public class Solution { public ListNode

这是LeetCode上的排序列表问题 我制作了一个Java解决方案,但它导致在一个非常长的测试用例上超过了时间限制。我在代码中找不到bug。有人能指出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;
    }
}
类列表节点{
int-val;
listnodenext;
ListNode(intx){
val=x;
next=null;
}
}
公共类解决方案{
公共ListNode排序列表(ListNode头){
返回此.sortPart(head,null);
}
专用ListNode排序部分(ListNode开始,ListNode结束){
if(start==null)返回null;
如果(开始==结束)返回开始;
ListNode l=start,r=start,p=start.next;
while(p!=null&&p!=end){
如果(p.val
错误可能是已排序列表上的快速排序是
O(n*n)
。一个实用的解决方案是随机选择枢轴。标准的在线油藏采样算法解决了这一问题

然而,这可能还不够好。快速排序将使用
O(log(n))
调用创建一个调用堆栈,从而占用
O(log(n))
空间。如果他们设置了足够好的测试,他们应该能够验证您是否已通过

有关真正的解决方案,请参阅


考虑到有多少人通过了这个问题,我怀疑他们没有准确地理解
O(log(n))
space和
O(1)
space之间的区别。

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

然而,这可能还不够好。快速排序将使用
O(log(n))
调用创建一个调用堆栈,从而占用
O(log(n))
空间。如果他们设置了足够好的测试,他们应该能够验证您是否已通过

有关真正的解决方案,请参阅


考虑到有多少人通过了这个问题,我怀疑他们没有准确地理解
O(log(n))
space和
O(1)
space之间的区别。

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

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

您使用什么算法?是快速分拣吗?乍一看,这似乎不起作用。更好地说明算法每一步想要实现的目标(=解释)。命名为
leftMost
可能也会有所帮助,使当前的一些注释变得多余。您在分区中操作指针的方式远远不正确。看。谢谢你的建议,这是快速排序,我需要改进实现。你使用什么算法?是快速分拣吗?乍一看,这似乎不起作用。更好地说明算法每一步想要实现的目标(=解释)。命名为
leftMost
可能也会有所帮助,使当前的一些注释变得多余。您在分区中操作指针的方式远远不正确。看。谢谢你的建议,它是快速排序,我需要改进实现。非常感谢,它确实指出了我没有考虑的地方。非常感谢,它确实指出了我没有考虑的地方。