合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
我第一个想法就是昨天的算法,将他们转化为两两合并的问题。
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1==null)
return l2;
if(l2==null)
return l1;
if(l1.val<l2.val){
l1.next=mergeTwoLists(l1.next,l2);
return l1;}
else{
l2.next=mergeTwoLists(l1,l2.next);
return l2;
}
}
public ListNode mergeKLists(ListNode[] lists) {
if (lists == null || lists.length == 0)
return null;
for(int i=1;i<lists.length;i++)
{ lists[0]=mergeTwoLists(lists[0],lists[i]);
}
return lists[0];
}
}
我看解答发现了优先队列方法给大家一起学习其中 @Override时为了防止重载,当重载会报错的注释。
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if (lists == null || lists.length == 0) return null;
PriorityQueue<ListNode> queue = new PriorityQueue<>(lists.length, new Comparator<ListNode>() {
@Override
public int compare(ListNode o1, ListNode o2) {
if (o1.val < o2.val) return -1;
else if (o1.val == o2.val) return 0;
else return 1;
}
});
ListNode dummy = new ListNode(0);
ListNode p = dummy;
for (ListNode node : lists) {
if (node != null) queue.add(node);
}
while (!queue.isEmpty()) {
p.next = queue.poll();
p = p.next;
if (p.next != null) queue.add(p.next);
}
return dummy.next;
}
333

被折叠的 条评论
为什么被折叠?



