0
点赞
收藏
分享

微信扫一扫

Day16 合并K个升序链表

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

https://leetcode-cn.com/problems/merge-k-sorted-lists/

示例1:

示例2:

示例3:

提示:

Java解法

package sj.shimmer.algorithm.ten_2;

import sj.shimmer.algorithm.ListNode;

/**
 * Created by SJ on 2021/2/9.
 */

class D16 {
    public static void main(String[] args) {
        ListNode n1 = ListNode.createNode(new int[]{1,4,5});
        ListNode n2 = ListNode.createNode(new int[]{1,3,4});
        ListNode n3 = ListNode.createNode(new int[]{2,6});
        ListNode n4 = ListNode.createNode(new int[]{});
//        System.out.println(mergeKLists(new ListNode[]{n1,n2,n3}));
//        System.out.println(mergeKLists(new ListNode[]{}));
//        System.out.println(mergeKLists(new ListNode[]{n4}));

        System.out.println(mergeKLists2(new ListNode[]{n1,n2,n3}));
        System.out.println(mergeKLists2(new ListNode[]{}));
        System.out.println(mergeKLists2(new ListNode[]{n4}));
    }
    public static ListNode mergeKLists2(ListNode[] lists) {
        ListNode preHead = new ListNode();
        ListNode pre = preHead;
        int minIndex = getMin(lists);
        while (minIndex!=-1) {
            ListNode node = lists[minIndex];
            pre.next = node;
            pre = pre.next;
            lists[minIndex] = node.next;
            minIndex = getMin(lists);
        }
        return preHead.next;
    }
    public static ListNode mergeKLists(ListNode[] lists) {
        ListNode head = null;
        int minIndex = getMin(lists);
        if (minIndex==-1) {
            return null;
        }
        head = lists[minIndex];
        lists[minIndex] = head.next;
        head.next = mergeKLists(lists);
        return head;
    }
    public static int getMin(ListNode[] lists) {
        ListNode min = null;
        int minIndex = -1;

        for (int i = 0; i < lists.length; i++) {

            if (lists[i] == null) {
                continue;
            }
            if (min == null||min.val>lists[i].val) {
                min = lists[i];
                minIndex = i;
            }
        }
        return minIndex;
    }
}

官方解

https://leetcode-cn.com/problems/merge-k-sorted-lists/solution/he-bing-kge-pai-xu-lian-biao-by-leetcode-solutio-2/

  1. 顺序合并

    • 时间复杂度: O(k^2 *n)
    • 空间复杂度:O(1)
  2. 分治合并

    • 时间复杂度为O(kn×logk)。
    • 空间复杂度:递归会使用到 O(logk)
举报

相关推荐

0 条评论