给你一个链表数组,每个链表都已经按升序排列。
    请你将所有链表合并到一个升序链表中,返回合并后的链表。

    示例 1:

    输入:lists = [[1,4,5],[1,3,4],[2,6]]
    输出:[1,1,2,3,4,4,5,6]
    解释:链表数组如下:
    [
    1->4->5,
    1->3->4,
    2->6
    ]
    将它们合并到一个有序链表中得到。
    1->1->2->3->4->4->5->6

    示例 2:

    输入:lists = []
    输出:[]

    示例 3:

    输入:lists = [[]]
    输出:[]

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/merge-k-sorted-lists

    思路:**
    与21.合并两个有序链表类似,这次我们需要合并K个升序链表,可以想到我们通过分治来完成:

    • 将每两个链表合并,k个升序链表变为k/2个升序链表

    重复这个过程,最终只剩下一个一个升序链表。
    复杂度分析:(抄自官方题解)
    image.png

    1. var mergeKLists = function (lists) {
    2. const merge = (lists, l, r) => {
    3. if (l === r) return lists[l];
    4. if (l > r) return null;
    5. let mid = (l + r) >> 1;
    6. return mergeList(merge(lists, l, mid), merge(lists, mid + 1, r));
    7. };
    8. const mergeList = (a, b) => {
    9. if ((!a) || (!b)) return a ? a : b;
    10. let head = new ListNode();
    11. let cur = head;
    12. let aPtr = a;
    13. let bPtr = b;
    14. while (aPtr && bPtr) {
    15. if (aPtr.val < bPtr.val) {
    16. cur.next = aPtr;
    17. aPtr = aPtr.next;
    18. } else {
    19. cur.next = bPtr;
    20. bPtr = bPtr.next;
    21. }
    22. cur = cur.next;
    23. }
    24. cur.next = aPtr ? aPtr : bPtr;
    25. return head.next;
    26. };
    27. return merge(lists, 0, lists.length - 1);
    28. };