题目: 给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。 题目链接
我的JavaScript解法
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode[]} lists
* @return {ListNode}
*/
var mergeKLists = function(lists) {
return merge(lists, 0, lists.length - 1);
};
var merge = function(lists, l, r) {
if (l == r) return lists[l];
if (l > r) return null;
let mid = (l + r) >> 1;
return mergeTwoLists(merge(lists, l, mid), merge(lists, mid + 1, r));
}
var mergeTwoLists = function(list1, list2) {
let head = new ListNode(-1), current = head;
let p1 = list1, p2 = list2;
while(p1 != null && p2 != null) {
if (p1.val <= p2.val) {
current.next = p1;
p1 = p1.next;
} else {
current.next = p2;
p2 = p2.next;
}
current = current.next;
}
if(p1!=null) {
current.next = p1;
}
if(p2!=null) {
current.next = p2;
}
return head.next;
};
解析: 归并排序(分治法)
-
时间复杂度:「向上回升」的过程——第一轮合并 组链表,每一组的时间代价是;第二轮合并 组链表,每一组的时间代价是 ......总的时间代价是 = O(kn×logk)$。
-
空间复杂度: