题目
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
分析
经典问题:k路归并,用一个大小为k小根堆保存每个链表的至多一个节点(链表空时,就没节点了),每次取出最小的节点,并插入该节点在链表中的下一个节点(如果不为空),直至取完所有链表节点。
这题在阿里巴巴2014实习生笔试中对应一道填空题,问M个长度为N的有序链表排序的时间复杂度:O(M*N*lgM)
代码
import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;
public class MergeKSortedLists {
public ListNode mergeKLists(ArrayList<ListNode> lists) {
if (lists == null || lists.size() == 0) {
return null;
}
PriorityQueue<ListNode> pq = new PriorityQueue<ListNode>(lists.size(),
new Comparator<ListNode>() {
@Override
public int compare(ListNode ln1, ListNode ln2) {
return ln1.val - ln2.val;
}
});
// init
for (ListNode head : lists) {
if (head != null) {
pq.add(head);
}
}
// merge
ListNode dummy = new ListNode(0);
ListNode p = dummy;
while (!pq.isEmpty()) {
p.next = pq.poll();
p = p.next;
if (p.next != null) {
pq.offer(p.next);
}
}
return dummy.next;
}
}