「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」
LeetCode23.合并K个生序链表
题目要求
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:[ 1->4->5, 1->3->4, 2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6
思路1.暴力破解
-
把lists里面每个节点的值合并成一个数组
-
再把合并的数组进行排序
-
最后把这个数组以链表的形式返回
var mergeKLists = function (lists) {
// 把节点的值合并成一个数组
let arr = [];
for (let i = 0; i < lists.length; i++) {
while (lists[i]) {
arr.push(lists[i].val);
lists[i] = lists[i].next;
}
}
// 数组排序
arr.sort((a, b) => a - b);
//以节点的形式返回链表
let dummy = new ListNode(0);
let cur = dummy;
for (let i = 0; i < arr.length; i++) {
cur.next = new ListNode(arr[i]);
cur = cur.next;
}
return dummy.next; };
思路2.分治排序
-
先找到一个中间的值,把这个数组分为两部分
-
再把两部分分成两部分不断递归,直到无法再进行递归的时候
-
最后是合并两个链表
var mergeKLists = function(lists) {
return merge(lists, 0, lists.length - 1);
// 不断的进行分组
function merge(lists, begin, end){
if (begin == end) return lists[begin];
if (begin > end) return null;
let mid = (begin + end) >> 1;
let l1 = merge(lists, begin, mid);
let l2 = merge(lists, mid + 1, end);
return mergeTwoLists(l1, l2);
}
// 合并
function mergeTwoLists(l1,l2){
if (l1 == null || l2 == null) {
return l1 != null ? l1 : l2
}
let dummy = new ListNode(0);
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 != null ? l1 : l2;
return dummy.next;
}
};