题目:Sort List
难度:medium
问题描述:
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
求解思路:
使用归并排序,会比147使用的插入排序复杂度低
算法如下:
public static ListNode sortList(ListNode head) {
if(head==null || head.next==null) return head;
return mergeSort(head);
}
private static ListNode mergeSort(ListNode head){
if(head==null || head.next==null) return head;
//分治
ListNode p1 = head;
ListNode p2 = head;
while(p2.next!=null && p2.next.next!=null){
p1 = p1.next;
p2 = p2.next.next;
}
ListNode left = head;
ListNode right = p1.next;
p1.next = null;
//排序子链表
left = mergeSort(left);
right = mergeSort(right);
//合并
if(left==null) return right;
if(right==null) return left;
ListNode h = new ListNode(-1);
ListNode p = h;
while(left!=null && right!=null){
if(left.val<right.val){
p.next = left;
left = left.next;
p = p.next;
}else{
p.next = right;
right = right.next;
p = p.next;
}
}
if(left==null) p.next = right;
else p.next = left;
return h.next;
}