题目描述
Sort a linked list in O(n log n) time using constant space complexity.
题目解析
归并排序,使用fast和slow指针的方式来将链表一分为二。
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode sortList(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode slow = head,fast = head,firstHalf = head;
while(fast.next!= null && fast.next.next!=null)
{
slow = slow.next;
fast = fast.next.next;
}
ListNode secondHalf = slow.next;
slow.next = null;
ListNode left = null, right = null;
if(firstHalf!=secondHalf)
{
left = sortList(firstHalf);
right = sortList(secondHalf);
}
return mergeList(left,right);
}
public ListNode mergeList(ListNode left,ListNode right){
if(right == null)
return left;
if(left == null)
return right;
ListNode fakeHead = new ListNode(-1);
ListNode ptr = fakeHead;
while(right!=null&&left!=null){
if(right.val<left.val){
ptr.next = right;
ptr = ptr.next;
right = right.next;
} else{
ptr.next = left;
ptr = ptr.next;
left = left.next;
}
}
if(right!=null)
ptr.next = right;
if(left!=null)
ptr.next = left;
return fakeHead.next;
}
}