148. Sort List
Sort a linked list in O(n log n) time using constant space complexity.
在O(nlogn)时间内,使用常数空间对链表进行排序。使用归并排序
参考:
21.Merge Two Sorted Lists Java版 递归和非递归实现
23.Merge k Sorted Lists Java版本(合并k个有序的链表)
public ListNode sortList(ListNode head) {
if (head == null || head.next == null)
return head;
// 使用快慢指针查找中间结点
ListNode fast = head;
ListNode slow = head;
while (fast.next != null) {
fast = fast.next.next;
// 让slow少走一步,结点数目均匀
if (fast == null)
break;
slow = slow.next;
}
ListNode right = slow.next;
// 注意断链
slow.next = null;
ListNode left = sortList(head);
right = sortList(right);
return mergeTwoLists(left, right);
}
// 递归实现链表排序
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode res = null;
if (l1 == null)
return l2;
if (l2 == null)
return l1;
if (l1.val <= l2.val) {
res = l1;
l1.next = mergeTwoLists(l1.next, l2);
} else {
res = l2;
l2.next = mergeTwoLists(l1, l2.next);
}
return res;
}