题目:合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解决方案,需要对每个数据进行排序,我们选择构建一个最小堆,将每个元素放入堆中,然后创建一个新的链表,将堆顶元素依次取出,并添加到链表中。
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
int len = 0;
if((len=lists.length)==0 || lists == null) return null;
ListNode preHead = new ListNode(-1);
ListNode preNode = preHead;
PriorityQueue<ListNode> queue = new PriorityQueue<>(len, new Comparator<ListNode>() {
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val - o2.val;
}
});
for (ListNode node : lists) {
if(node!=null) queue.add(node);
}
while(!queue.isEmpty()){
ListNode small = queue.poll();
preNode.next = small;
if(small.next!=null) queue.add(small.next); //将最小值节点后面的节点添加到队里中
preNode = preNode.next;
}
return preHead.next;
}
}