23. 合并K个升序链表
题目
思路
在思考合并 k 个有序链表的时候,我们可以先将繁化简,先思考两个有序链表如何合并。LeetCode 上刚好也有一样的题目: 21. 合并两个有序链表。
两个有序链表合并还是比较简单的,有两个要注意的地方:
- 不要忘了定义一个哨兵结点来存储合并后的链表。
- 不要忘了将两个比较完后有余的链表添加到结果链表的后面。
const merge = (list_1, list_2) => {
const sentinelNode = new ListNode(0);
let p = sentinelNode;
while (list_1 && list_2) {
if (list_1.val < list_2.val) {
p.next = list_1;
list_1 = list_1.next;
} else {
p.next = list_2;
list_2 = list_2.next;
}
p = p.next;
}
p.next = list_1 ? list_1 : list_2;
return sentinelNode.next;
};
接着就可以考虑如何分而治之了,如下图:
代码
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode[]} lists
* @return {ListNode}
*/
var mergeKLists = function (lists) {
/* 分而治之 */
if (lists.length <= 1) return lists[0] || null;
const newLists = [];
for (let i = 0; i < lists.length; i += 2) {
newLists.push(merge(lists[i], lists[i + 1] || null));
}
return mergeKLists(newLists);
};
const merge = (list_1, list_2) => {
const sentinelNode = new ListNode(0);
let p = sentinelNode;
while (list_1 && list_2) {
if (list_1.val < list_2.val) {
p.next = list_1;
list_1 = list_1.next;
} else {
p.next = list_2;
list_2 = list_2.next;
}
p = p.next;
}
p.next = list_1 ? list_1 : list_2;
return sentinelNode.next;
};
最后有啥不足多多指教😜,Thanks♪(・ω・)ノ