题目:
给定一个链表数组,每个链表都已经按升序排列。
请将所有链表合并到一个升序链表中,返回合并后的链表。
示例 :
输入: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
思路:
这道题和上一道差不多,用到归并,然后再用到之前的合并函数。
具体思路和实现见代码。
复杂度:
时间:递归调用的乘上每个节点 O(mlogn)。
空间:递归调用 O(logn)。
代码:
public ListNode mergeKLists(ListNode[] lists) {
//牢记什么时候都先解决特殊情况
if(lists.length == 0){
return null;
}
//调用自定义的合并链表数组的
return mergeLists(lists,0,lists.length);
}
private ListNode mergeLists(ListNode[] lists,int l,int r){
//还是先排除特殊情况,lists不为空,但是只有一条记录的话也直接返回
if(l+1 == r) return lists[l];
//取mid中间位置坐标
int mid = l + ((r-l)>>1);
//开始递归这两个部分
ListNode node1 = mergeLists(lists,l,mid);
ListNode node2 = mergeLists(lists,mid,r);
//具体的逻辑放在下面这个merge方法里,上次写过的
return merge(node1,node2);
}
private ListNode merge(ListNode node1,ListNode node2){
ListNode res = new ListNode(0);
ListNode cur = res;
while(node1!=null && node2!=null){
if(node1.val<node2.val){
cur.next = node1;
node1 = node1.next;
} else{
cur.next = node2;
node2 = node2.next;
}
cur = cur.next;
}
cur.next = node1==null?node2:node1;
return res.next;
}