LeetCode 148.排序链表
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:输入: -1->5->3->4->0
输出: -1->0->3->4->5来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这个问题其实就是经典归并排序的链表实现形式:
public ListNode sortList(ListNode head) {
if (head == null) return null;
ListNode counter = head;
int len = 0;
while (counter != null) {
len++;
counter = counter.next;
}
return sort(head, len);
}
private ListNode sort(ListNode head, int len) {
//递归终止条件
if (len <= 1) return head;
//递归过程
//分割链表
ListNode leftEnd = head;
for (int i = 0; i < len / 2 - 1; i++) {
leftEnd = leftEnd.next;
}
ListNode rightStart = leftEnd.next;
//断开链表
leftEnd.next = null;
return merge(sort(head, len / 2), sort(rightStart, len - len / 2));
}
private ListNode merge(ListNode l1, ListNode l2) {
//递归终止条件
if (l1 == null) return l2;
if (l2 == null) return l1;
ListNode head;
//递归过程
if (l1.val <= l2.val) {
head = l1;
l1.next = merge(l1.next, l2);
} else {
head = l2;
l2.next = merge(l1, l2.next);
}
return head;
}
未完持续...