23. 合并K个升序链表
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
解: 思路: 套用合并两个有序链表的方式,两个指针比大小依次放入结果链表然后指针后移。
- 由于不知道要循环多少次,所以先遍历一次链表数组,获取所有节点个数。
- while循环次数就是节点个数
- while循环中,设置最小值和最小节点两个变量,依次跟链表数组的头节点比较,找出全局最小头节点。将结果链表跟这个头节点链接,然后把这个头节点脱离原链表
- 循环结束表明所有节点都已经链接到结果链表,返回结果链表的头节点。
const mergeKLists = function(lists) {
let resList = null
let resHead = null
let allLen = 0
for (let i = 0; i < lists.length; i++) {
let tempNode = lists[i]
while (tempNode) {
tempNode = tempNode.next
allLen++
}
}
while (allLen) {
let minVal = Infinity
let minNode = null
let idx = -1
for (let i = 0; i < lists.length; i++) {
const item = lists[i]
if (!item) continue
if (item.val < minVal) {
minVal = item.val
minNode = item
idx = i
}
}
if (!resHead) {
resHead = minNode
resList = minNode
} else {
resList.next = minNode
resList = resList.next
}
const temp = minNode.next
minNode.next = null
minNode = temp
lists[idx] = minNode
allLen--
}
return resHead
};