Sort a linked list in O(n log n) time using constant space complexity.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode sortList(ListNode head) {
if(head==null || head.next==null){
return head;
}
ListNode midd=getMidder(head);
ListNode headR=midd.next;
midd.next=null;
return megger(sortList(head),sortList(headR));
}
private ListNode getMidder(ListNode head){
if(head==null)
return null;
ListNode slow=head;
ListNode fast=head;
while(fast.next!=null && fast.next.next!=null){//这里不是fast!=null && fast.next!=null !!!! 如 1-》2=》null
slow=slow.next;
fast=fast.next.next;
}
return slow;
}
private ListNode megger(ListNode headL,ListNode headR){
if(headL==null)
return headR;
if(headR==null)
return headL;
ListNode tmpHead=new ListNode(-1);
ListNode tmpNext=tmpHead;
while(headL!=null && headR!=null){
if(headL.val>=headR.val){
tmpNext.next=headR;
headR=headR.next;
}
else{
tmpNext.next=headL;
headL=headL.next;
}
tmpNext=tmpNext.next;
tmpNext.next=null;
}
tmpNext.next = headL!=null?headL:headR; //这个不能少!!!
return tmpHead.next;
}
}
这篇文字说快排也可以,但没有测试过: http://blog.youkuaiyun.com/jiadebin890724/article/details/21334059