Sort a linked list in O(n log n) time using constant space complexity.
看到 O(nlogn)第一想到的是merge sort,这里采用的是每次merge前遍历当前list,找到中间节点,然后对head和中间节点分别再进行sort,再merge。
或者也可以用两个point,start和end,当start==end时,到了base case,return当前node,不过仍要遍历list以获取start所在节点的位置。
public ListNode sortList(ListNode head) {
if(head==null||head.next==null)
return head;
ListNode slow = head, fast = head;
while(fast.next!=null && fast.next.next!=null){
slow=slow.next;
fast=fast.next.next;
}
fast=slow.next;
slow.next=null;
slow = sortList(head);
fast = sortList(fast);
return merge(slow,fast);
}
public ListNode merge(ListNode l1, ListNode l2){
if(l1==null||l2==null)
return l1==null? l2 : l1;
ListNode head = null, run = null;
if(l1.val>l2.val){
head = l2;
l2=l2.next;
}
else{
head = l1;
l1=l1.next;
}
run = head;
while(l1!=null && l2!=null){
if(l1.val<l2.val){
run.next=l1;
run=run.next;
l1=l1.next;
}
else{
run.next=l2;
run=run.next;
l2=l2.next;
}
}
if(l1!=null)
run.next=l1;
else if(l2!=null)
run.next=l2;
return head;
}