Sort a linked list in O(n log n) time using constant space complexity.
因为要求是O(n log n),所以选择用归并排序的方法。但因为是linked list,所以需要先找出中点的位置。可以采用两个指针,一个每次移动两步,一个每次移动一步,当快指针走到底的时候,满指针刚好走到中间。
/**
* 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;
//if(head.next == null) return head;
ListNode fast = head;
ListNode slow = head;
while(fast.next!=null&&fast.next.next!=null){
fast = fast.next.next;
slow = slow.next;
}
ListNode mid = slow.next;
slow.next = null;
ListNode result = merge(sortList(head),sortList(mid));
return result;
}
ListNode merge(ListNode left,ListNode right)
{
ListNode result = new ListNode(0);
ListNode tmp = result;
while(left!=null&&right!=null)
{
if(left.val < right.val)
{
tmp.next = left;
tmp = tmp.next;
left = left.next;
}
else
{
tmp.next = right;
tmp = tmp.next;
right = right.next;
}
}
if(left== null)
{
tmp.next = right;
}
else
{
tmp.next = left;
}
return result.next;
}
}