链表合并的加强版,比较简单直观的方法是维护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; }
没有评论:
发表评论