快排也是可以的,多几个指针保存下哨兵位的左右子链表,需要注意的是处理当左右子链表为空的情况
时间复杂度O(nlogn),空间复杂度其实是O(logn),因为有栈的开销,但是其他解答里都是归并,其实也差不多,只有那个用cut的是满足题意的
ListNode* sort_inner_impl(ListNode* head, ListNode* end){
        if(!head || !head->next || head==end || head->next == end)return head;
        ListNode* lefthead,*leftend,*righthead,*rightend;
        ListNode* p=head;
        ListNode* cmp=head;
        lefthead=righthead=leftend=rightend=nullptr;
        while(p->next != end){
            p=p->next;
            if(p->val < cmp->val){
                if(!lefthead){
                    lefthead=p;
                }else{
                    leftend->next=p;
                }
                leftend=p;
            }else{
                if(!righthead){
                    righthead=p;
                }else{
                    rightend->next=p;
                }
                rightend=p;
            }
        }
        if(!lefthead){
            lefthead=cmp;
        }else{
            leftend->next=cmp;
            lefthead = sort_inner_impl(lefthead, cmp);
        }
        if(!righthead){
            cmp->next=end;
        }else{
            rightend->next = end;
            righthead = sort_inner_impl(righthead, end);
            cmp->next=righthead;
        }
        return lefthead;
    }
    
    ListNode* sortList(ListNode* head) {
        // write code here
        return sort_inner_impl(head, nullptr);
    }