Day73 排序链表

作者: Shimmer_ | 来源:发表于2021-04-10 23:29 被阅读0次

    给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表

    https://leetcode-cn.com/problems/sort-list/

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

    示例1:

    输入:head = [4,2,1,3]
    输出:[1,2,3,4]

    示例2:

    输入:head = [-1,5,3,4,0]
    输出:[-1,0,3,4,5]

    示例3:

    输入:head = []
    输出:[]

    提示:

    链表中节点的数目在范围 [0, 5 * 104] 内
    -105 <= Node.val <= 105

    Java解法

    思路:

    • 将链表切割为已排序与未排序两个链表然后按顺序插入,
    • 参考官方解:使用归并分割链表,再使用合并有序链表完成后续操作
    package sj.shimmer.algorithm.m4_2021;
    
    import sj.shimmer.algorithm.ListNode;
    
    /**
     * Created by SJ on 2021/4/10.
     */
    
    class D73 {
        public static void main(String[] args) {
            ListNode node = ListNode.createNode(new int[]{4, 2, 1, 3});
            System.out.println(sortList(node));
        }
    
        public static ListNode sortList(ListNode head) {
            return spiltByMidSort(head,null);
        }
    
        public static ListNode spiltByMidSort(ListNode head,ListNode tail) {
            if (head == null) {
                return head;
            }
            if (head.next == tail) {
                head.next = null;
                return head;
            }
            ListNode slow = head;
            ListNode fast = head;
            if (fast!=tail) {
                slow = slow.next;
                fast = fast.next;
                if (fast!=tail) {
                    fast = fast.next;
                }
            }
            ListNode midH = slow;
            ListNode n1 = spiltByMidSort(head,midH);
            ListNode n2 = spiltByMidSort(midH,tail);
            return mergeTwoLists(n1,n2);
        }
    
        public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
            if (l1 == null&&l2 == null) {
                return null;
            }
            if (l1 == null) {
                return l2;
            }
            if (l2 == null) {
                return l1;
            }
            ListNode head = null;
            if (l1.val>l2.val) {
                head = l2;
                head.next = mergeTwoLists(l1,l2.next);
            }else {
                head = l1;
                head.next = mergeTwoLists(l1.next,l2);
            }
            return head;
        }
    }
    
    image

    官方解

    https://leetcode-cn.com/problems/sort-list/solution/

    1. 自顶向下归并排序

      参考解,如上

      • 时间复杂度:O(nlogn)
      • 空间复杂度:O(logn)
    2. 自底向上归并排序

      直接分解节点,再两两合并

      • 时间复杂度:O(nlogn)
      • 空间复杂度:O(1)

    相关文章

      网友评论

        本文标题:Day73 排序链表

        本文链接:https://www.haomeiwen.com/subject/htpokltx.html