给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
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;
    }
}


官方解
- 
顺序合并 - 时间复杂度: O(k^2 *n)
- 空间复杂度:O(1)
 
- 
分治合并 - 时间复杂度为O(kn×logk)。
- 空间复杂度:递归会使用到 O(logk)
 










