题目
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
一. 递归法
找出列表中头结点最小的值作为新的头结点,剩下部分递归求值,如果列表中存在null
则删除此项。如果列表中只有一个链表,则返回此链表。
js实现
/**
* 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) {
return null
}
if (lists.length === 1) {
return lists[0]
}
var index = 0
var min = Infinity
var i=0
while (i<lists.length) {
if (lists[i] === null) {
lists.splice(i, 1)
continue
} else if (lists[i].val < min) {
min = lists[i].val
index = i
}
i++
}
var head = lists[index]
if (!lists.length) {
return null
}
lists[index] = lists[index].next
head.next = mergeKLists(lists)
return head
}
复杂度分析
时间复杂度:O(kn)
空间复杂度:O(1)
测试结果
✔ Accepted
✔ 131/131 cases passed (296 ms)
✔ Your runtime beats 39.04 % of javascript submissions
✔ Your memory usage beats 68.42 % of javascript submissions (38.5 MB)