链表

排序链表

中等#148Java时间 O(n log n)空间 O(log n)

题目要做什么

把链表按非递减顺序排序,要求 O(n log n) 时间。这里采用自顶向下归并排序,使用 O(log n) 递归空间。

题目示例输入head = [4,2,1,3]
题目示例输出[1,2,3,4]

01 为什么这样做

快慢指针找到中点,断开为两条链,分别递归排序,再通过移动节点连接合并两个有序结果。若严格要求 O(1) 辅助空间,可改用自底向上的迭代归并。

始终成立的条件

merge 的两个输入都已排序,tail 前面的输出按非递减顺序排列。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public ListNode sortList(ListNode head) {3        if (head == null || head.next == null) return head;4        ListNode slow = head, fast = head.next;5        while (fast != null && fast.next != null) {6            slow = slow.next; fast = fast.next.next;7        }8        ListNode second = slow.next;9        slow.next = null;10        ListNode left = sortList(head);11        ListNode right = sortList(second);12        return merge(left, right);13    }14    private ListNode merge(ListNode a, ListNode b) {15        ListNode dummy = new ListNode(0), tail = dummy;16        while (a != null && b != null) {17            if (a.val <= b.val) {18                tail.next = a; a = a.next;19            } else {20                tail.next = b; b = b.next;21            }22            tail = tail.next;23        }24        tail.next = a == null ? b : a;25        return dummy.next;26    }27}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索