思路:
- 本题要求将k个升序的链表合并成一个
- 第一想法是遍历链表数组,找到所有头节点最小的节点,再找第二小的节点,直到按顺序找到所有节点
- 第二想法是链表数组第一个和第二个合并,这个整体再和第三个合并,直到合并最后一个
- 但是更快的方法是链表数组第一个和第二个合并,第三个和第四个合并...第一轮结束个数减半,后面每一轮都减半,直到只剩一个链表
代码:
- 遍历整个数组奇数下标
- 合并该位置和下一位的链表,新链表的指针要在链表头处
- 收集这一轮的新链表
- 重复这个过程直到新链表只剩一个,则该链表就是结果
- 增加边界条件的判断
var mergeKLists = function (lists) {
let temp = []
if (lists.length === 0) {
return null
}
while (lists.length > 1) {
for (let i = 0; i < lists.length; i += 2) {
let l1 = lists[i]
let l2 = i + 1 < lists.length ? lists[i + 1] : null
let sum = merge2Lists(l1, l2)
temp.push(sum)
}
lists = temp
temp = []
}
return lists[0]
};
function merge2Lists(l1, l2) {
let dummy = new ListNode()
let cur = dummy
while (l1 && l2) {
if (l1.val < l2.val) {
cur.next = l1
l1 = l1.next
} else {
cur.next = l2
l2 = l2.next
}
cur = cur.next
}
cur.next = l1 || l2
return dummy.next
}