タイトルの説明
ACコード
まず、問題は、時間の複雑度がO(nlogn)であり、一定レベルのスペースの複雑度であることが必要です。要件を満たすよく知られたソートアルゴリズムはマージソートです(高速のソートスペースの複雑度は問題の意味を満たしません)。これは反復によっても実現できますが、ここでの意図と一致しています。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode sortList(ListNode head) {
//排序可能会引起头结点变化,需要创建虚拟头结点
ListNode dummy=new ListNode(-1);
dummy.next=head;
//遍历链表,求出链表的长度len
int len=0;
for(ListNode cur=head;cur!=null;cur=cur.next)
len++;
for(int i=1;i<len;i*=2){
ListNode cur=dummy;
for(int j=0;j+i<len;j+=i*2){
ListNode left=cur.next,right=cur.next;
for(int k=0;k<i;k++)
right=right.next;
int l=0,r=0;
while(l<i&&r<i&&right!=null)
{
if(left.val<=right.val){
cur.next=left;
cur=left;
left=left.next;
l++;
}else{
cur.next=right;
cur=right;
right=right.next;
r++;
}
}
while(l<i){
cur.next=left;
cur=left;
left=left.next;
l++;
}
while(r<i&&right!=null){
cur.next=right;
cur=right;
right=right.next;
r++;
}
cur.next=right;
}
}
return dummy.next;
}
}