给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 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 = [[]]
输出:[]
分治算法
1:分治,先将K个链表分成两个部分,先合并两个部分,在合并这两个部分返回的链表。
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
ListNode ans = null;
for(int i=0;i<lists.length;i++){
ans = merge(ans,lists[i]);
}
return ans;
}
public ListNode merge(ListNode a,ListNode b){
if(a==null||b==null){
return a!=null?a:b;
}
ListNode head = new ListNode(0);
ListNode tail = head,p = a,q =b;
while(p!=null&&q!=null){
if(p.val>=q.val){
ListNode c = new ListNode(q.val);
tail.next = c;
tail = c;
q = q.next;
}
else{
ListNode c = new ListNode(p.val);
tail.next = c;
tail = c;
p = p.next;
}
}
if(p!=null) tail.next = p;
if(q!=null) tail.next = q;
return head.next;
}
}
|