算法学习记录(八十五)

96 阅读1分钟

23. 合并K个升序链表

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

image.png

解: 思路: 套用合并两个有序链表的方式,两个指针比大小依次放入结果链表然后指针后移。

  1. 由于不知道要循环多少次,所以先遍历一次链表数组,获取所有节点个数。
  2. while循环次数就是节点个数
  3. while循环中,设置最小值和最小节点两个变量,依次跟链表数组的头节点比较,找出全局最小头节点。将结果链表跟这个头节点链接,然后把这个头节点脱离原链表
  4. 循环结束表明所有节点都已经链接到结果链表,返回结果链表的头节点。
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
};