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

分析:和这道题差不多阿,都是链表,用归并排序做。题目要求O(nlogn),好像就是快排和归并? 递归的关键是写出递推公式和的终止条件。
分治思想,每次都用q分隔(p..r)

递推公式:
merge_sort(p..r) = merge(merge_sort(p..q), merge_sort(q+1..r))
终止条件:
p >= r 不用再继续分解

图片描述

class Solution {
    public ListNode sortList(ListNode head) {
        if (head == null || head.next == null)
            return head;
        ListNode fast = head.next, slow = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        ListNode tmp = slow.next;
        slow.next = null;
        ListNode left = sortList(head);
        ListNode right = sortList(tmp);
        ListNode h = new ListNode(0);
        ListNode res = h;
        while (left != null && right != null) {
            if (left.val < right.val) {
                h.next = left;
                left = left.next;
            } else {
                h.next = right;
                right = right.next;
            }
            h = h.next;
        }
        h.next = left != null ? left : right;
        return res.next;
    }
}

参考: 极客时间 王争 算法与数据结构之美


yint
388 声望21 粉丝

转AIing


引用和评论

0 条评论