这道题一开始只能想到用这种方法来解,我推测应该是能过的,实际上确实能过。
结果如下:
执行用时:112 ms, 在所有 JavaScript 提交中击败了44.90%的用户
内存消耗:46.9 MB, 在所有 JavaScript 提交中击败了25.47%的用户
通过测试用例:
133 / 133
这道题要注意的是:
1. 输入和返回值的不同,这道题用例输入的数组,空数组的情况下,代码中要返回的却是null
2. 因为是直接解的,所以有很多边界条件需要处理,比如寻找第一个有序序列时的边界条件
3. 先解构ListNode对象,使其变成数组,再由数组转变成ListNode对象,应该是很耗时的,这个应该优化,如果要优化,直接解法应该是行不通的
/**
* 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) {
if (!lists || lists.length === 0) {
return null
}
if (lists.length === 1) {
return lists[0]
}
// 置入第一个有序序列
const orignArr = []
let firstListNode
let index = 0
for (; index < lists.length; index++) {
firstListNode = lists[index]
if (firstListNode instanceof ListNode && firstListNode !== null) {
break
}
}
if(!firstListNode) {
return null
}
while (firstListNode.next !== null) {
orignArr.push(firstListNode.val)
firstListNode = firstListNode.next
}
orignArr.push(firstListNode.val)
let getCorrectPosition = function (orignArr, target) {
let low = 0
let high = orignArr.length - 1
let findFlag = false
while (low <= high) {
let mid = (low + high) >>> 1
if (orignArr[mid] === target) {
findFlag = true
orignArr.splice(mid + 1, 0, target)
break
} else if (orignArr[mid] < target) {
low = mid + 1
} else if (orignArr[mid] > target) {
high = mid - 1
}
}
if (!findFlag) {
orignArr.splice(high + 1, 0, target)
}
}
for (let i = index + 1; i < lists.length; i++) {
let element = lists[i]
if(element === null) {
continue
}
while (element.next !== null) {
getCorrectPosition(orignArr, element.val)
element = element.next
}
getCorrectPosition(orignArr, element.val)
}
// 构造链表
let buildLinkTable = function (orignArr, i) {
if (i === orignArr.length - 1) {
return new ListNode(orignArr[i])
}
return new ListNode(orignArr[i], buildLinkTable(orignArr, ++i))
}
const result = buildLinkTable(orignArr, 0)
return result
};