题目描述
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;
}
}