难度:困难
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入: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
示例 2:
输入:lists = []
输出:[]
示例 3:
输入:lists = [[]]
输出:[]
分而治之:
/**
* 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) {
if(!lists.length ){
return null
}
return mergeList(lists,0,lists.length)
};
function mergeList(lists,start,end){ //将若干个链表不断二分,return合并完且排序好的链表
if(start + 1 == end){ //不能再分的条件:lists中只有一个链表,直接返回该链表
return lists[start]
}
let mid = Math.floor((start+end)/2) //向下取整
let list1 = mergeList(lists,start,mid)
let list2 = mergeList(lists,mid,end)
return merge(list1,list2) //合并且排序传入的两个链表
}
function merge(list1,list2){ //将两个链表排序且并合为一个链表的函数
let x = new ListNode(0)
let point = x //指针
while(list1 && list2){ //有一个链表为空即结束循环
if(list1.val<=list2.val){
point.next = list1
list1 = list1.next
}else{
point.next = list2
list2 = list2.next
}
point = point.next
}
point.next = list1 == null ? list2 : list1 //没遍历完的链表直接接上即可
return x.next
}