在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
使用归并排序
public ListNode sortList(ListNode head) {
if(head == null || head.next == null) return head;
ListNode slow = head;
ListNode pre = head;
ListNode fast = head;
while(fast != null && fast.next != null){
// 找出中间节点,无论奇偶数节点,pre都停留在中间的前一个
// slow会停在中间或中间的后一个
pre = slow;
slow = slow.next;
fast = fast.next.next;
}
pre.next = null;
return merge(sortList(head), sortList(slow));
}
public ListNode merge(ListNode l1, ListNode l2){
if(l1 == null) return l2;
if(l2 == null) return l1;
if(l1.val < l2.val){
l1.next = merge(l1.next, l2);
return l1;
}else{
l2.next = merge(l1, l2.next);
return l2;
}
}