280,排序链表

在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4

示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5

答案:

 1public ListNode sortList(ListNode head) {
2    if (head == null || head.next == null)
3        return head;
4    // 把链表分为两部分
5    ListNode prev = null, slow = head, fast = head;
6    while (fast != null && fast.next != null) {
7        prev = slow;
8        slow = slow.next;
9        fast = fast.next.next;
10    }
11    prev.next = null;
12    // 分别排序这两部分
13    ListNode l1 = sortList(head);
14    ListNode l2 = sortList(slow);
15    // 然后再合并
16    return merge(l1, l2);
17}
18
19ListNode merge(ListNode l1, ListNode l2) {
20    ListNode l = new ListNode(0), p = l;
21    while (l1 != null && l2 != null) {
22        if (l1.val < l2.val) {
23            p.next = l1;
24            l1 = l1.next;
25        } else {
26            p.next = l2;
27            l2 = l2.next;
28        }
29        p = p.next;
30    }
31    if (l1 != null)
32        p.next = l1;
33    if (l2 != null)
34        p.next = l2;
35    return l.next;
36}

解析:

上一题我们已经介绍过链表排序了,使用的是插入排序,这一题我们使用的是归并排序,代码并不难理解,代码有注释,就不再过多介绍。

上一篇:280页《前端校招面试真题解析大全,MMKV集成与原理


下一篇:AEG 2A 400-280 HFRL1