思路:使用优先级队列来处理,省去了自己比较节点大小的步骤
1.遍历lists,先将每个链表的头节点都放入优先级队列中,队列会自动比较大小
2.定义一个新的链表dummyNode
3.然后利用poll()方法获取到最小的节点minNode,加入到新链表的后面
4.如果minNode.next != null,再把minNode.next放到队列中
重复步骤三和步骤四,直到队列中没有任何元素。
java
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
Queue<ListNode> queue = new PriorityQueue<>((v1, v2) -> v1.val - v2.val);
for (ListNode node: lists) {
if (node != null) {
queue.offer(node);
}
}
ListNode dummyHead = new ListNode(0);
ListNode tail = dummyHead;
while (!queue.isEmpty()) {
ListNode minNode = queue.poll();
tail.next = minNode;
tail = minNode;
if (minNode.next != null) {
queue.offer(minNode.next);
}
}
return dummyHead.next;
}
}
时间复杂度:O(kn*log(k))
空间复杂度:O(k)
看到此处即是情,别忘记点个赞哦。如果有其他问题,欢迎评论,共同探讨!!!