链表合并的加强版,比较简单直观的方法是维护K个链表的头,每次扫描一遍找到最小的然后将其合并到新的链表中,时间复杂度应该为O(nk),空间复杂度为O(1)。可以使用优先级队列来对时间复杂度进行优化,到达O(nlogk),空间复杂度为O(k)。Java的PriorityQueue可以用来实现优先级队列,在构造的时候给定初始的大小(不能小于1)和使用的Comparator即可。注意PriorityQueue不接受null,同时它不是线程安全的,多个线程同时改写数据会导致数据不同步。
public class ListNodeCmp implements Comparator<ListNode> {
public int compare(ListNode node1, ListNode node2) {
return node1.val - node2.val;
}
}
public ListNode mergeKLists(List<ListNode> lists) {
PriorityQueue<ListNode> qu = new PriorityQueue<ListNode>(1, new ListNodeCmp());
ListNode dummy = new ListNode(0);
for(ListNode node : lists) {
if(node != null) {
qu.add(node);
}
}
ListNode temp = dummy;
while(qu.size() != 0) {
ListNode mi = qu.poll();
temp.next = mi;
temp = temp.next;
if(mi.next != null) qu.add(mi.next);
}
return dummy.next;
}
没有评论:
发表评论