Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example:
Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6
解法思路
首先把k个链表的首元素都加入最小堆中,它们会自动排好序。然后我们每次取出最小的那个元素加入我们最终结果的链表中。
这里最小堆的实现直接调用Java的PriorityQueue。
实现代码
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length == 0)
return null;
// 小顶堆
PriorityQueue<ListNode> minHeap = new PriorityQueue<>(lists.length, new Comparator<ListNode>() {
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val - o2.val;
}
});
for (ListNode list:
lists) {
if (list != null)
minHeap.add(list);
}
ListNode res = new ListNode(0);
ListNode tmp = res;
ListNode poll;
while ((poll = minHeap.poll()) != null)
{
tmp.next = poll;
if (poll.next != null)
minHeap.add(poll.next);
tmp = tmp.next;
}
return res.next;
}