在 O(n log n) 时间复杂度和常数级的空间复杂度下给链表排序。
样例
给出 1->3->2->null
,给它排序变成 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 || head.next == null) return head;
ListNode first = head, second = null;
ListNode mid = getMid(head);
second = mid.next;
mid.next = null;//separate listNode
first = sortList(first);
second = sortList(second);
return merge(first, second);
}
ListNode merge(ListNode first, ListNode second) {
if(first == null) return second;
if(second == null) return first;
ListNode res = new ListNode(0);
ListNode curr = res;
while(first != null && second != null) {
if(first.val < second.val) {
curr.next = first;
curr = curr.next;
first = first.next;
} else {
curr.next = second;
curr = curr.next;
second = second.next;
}
}
if(first != null) curr.next = first;
if(second != null) curr.next = second;
return res.next;
}
ListNode getMid(ListNode head) {
ListNode slow = head, fast = head.next;
while(fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;//return 1 (2) 3 or 1 (2) 3 4
}
}