Sort a linked list in O(n log n) time using constant space complexity.
Example 1:
Input: 4->2->1->3
Output: 1->2->3->4
Example 2:
Input: -1->5->3->4->0
Output: -1->0->3->4->5
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode sortList(ListNode head) {
if(head==null || head.next==null) return head;
ListNode slow=head;
ListNode preSlow=null;
ListNode fast=head;
while(fast!=null && fast.next!=null){
preSlow=slow;
slow=slow.next;
fast=fast.next.next;
}
preSlow.next=null;
return mergeList(sortList(head),sortList(slow));
}
private ListNode mergeList(ListNode l1,ListNode l2){
ListNode dummy=new ListNode(-1);
ListNode merge=dummy;
while(l1!=null && l2!=null){
if(l1.val<l2.val){
merge.next=l1;
l1=l1.next;
merge=merge.next;
}
else{
merge.next=l2;
l2=l2.next;
merge=merge.next;
}
}
merge.next=(l1!=null)?l1:l2;
return dummy.next;
}
}