解题思路1:分治思想
链表两两合并,k个合并成k/2个,然后k/2合并为k/4个…直至最终合并成一个
边界的处理:当lists为空数组时,需要l = 0, r = -1,需要返回null,直接在数组长度为0时返回lists,监测到返回[undefined],不通过测试用例。
代码
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode[]} lists
* @return {ListNode}
*/
var mergeKLists = function (lists) {
let len = lists.length
return merge(lists, 0, len - 1)
};
function merge(lists, l, r) {
if (l === r) {
return lists[l]
}
if (l > r) return null
let mid = l + ((r - l) >> 1)
return merge2Lists(merge(lists, l, mid), merge(lists, mid + 1, r))
}
function merge2Lists(l1, l2) {
if (!l1 || !l2) {
return l1 ? l1 : l2
}
let i = l1
let j = l2
let cur = new ListNode(0)
let p = cur
while (i && j) {
if (i.val < j.val) {
cur.next = i
i = i.next
} else {
cur.next = j
j = j.next
}
cur = cur.next
}
cur.next = i ? i : j
return p.next
}