ort a linked list in O(n log n) time using constant space complexity.
Example
Given 1->3->2->null
, sort it to 1->2->3->null
.
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/*
* @param head: The head of linked list.
* @return: You should return the head of the sorted linked list, using constant space complexity.
*/
public ListNode sortList(ListNode head) {
if(head==null) return head;
return mergeSort(head);
}
ListNode mergeSort(ListNode head){
if(head.next==null)
return head;
ListNode slow = head;
ListNode fast = head;
//找到middle
while(fast.next!=null && fast.next.next!=null){
slow = slow.next;
fast = fast.next.next;
}
ListNode head2 = slow.next;
slow.next = null;
ListNode leftHead = mergeSort(head);
ListNode rightHead = mergeSort(head2);
return merge(leftHead, rightHead);
}
ListNode merge(ListNode left, ListNode right){
ListNode lNode = left;
ListNode rNode = right;
while(lNode!=null && rNode!=null){
if(lNode.val<rNode.val){
while(lNode.next!=null && lNode.next.val<rNode.val){
lNode=lNode.next;
}
ListNode tmp = lNode;
lNode = lNode.next;
tmp.next = rNode;
}else{
while(rNode.next!=null && rNode.next.val<=lNode.val){
rNode=rNode.next;
}
ListNode tmp = rNode;
rNode = rNode.next;
tmp.next = lNode;
}
}
if(left.val<right.val){
return left;
}else{
return right;
}
}
}