/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode[]} lists
* @return {ListNode}
*/
var mergeKLists = function (lists) {
var ll = lists.length;
if (ll === 1) {
return lists[0];
}
return dfs(lists, 0, lists.length - 1)
};
var dfs = function (lists, l, r) {
if (l === r) {
return lists[l]
}
if (l > r) {
return null
}
let mid = (l + r) >> 1
return mergeTwoLists(dfs(lists, l, mid), dfs(lists, mid + 1, r))
}
var mergeTwoLists = function (list1, list2) {
if (!list1) {
return list2
}
if (!list2) {
return list1
}
// 定义一个空的链表
let res = new ListNode(-1);
// 复制该链表,因为迭代过程中会改变链表
let ans = res;
// 迭代结束条件为当一个链表遍历结束即停止
while (list1 && list2) {
// 当list1节点大,则先指向list2 节点
if (list1.val >= list2.val) {
res.next = list2;
// 同时改变 list2 指针为下一个继续对比
list2 = list2.next;
} else {
res.next = list1;
list1 = list1.next;
}
// 每次迭代,改变当前链表的指向,以进行正确指向
res = res.next;
}
// 最后迭代结束后,可能会有一个链表还有剩余,且由于是递增的,所以直接等于剩余的链表头节点即可
res.next = list1 ? list1 : list2;
// 返回空节点的下一个即为最终的结果
return ans.next;
};