/**
<p>给你一个链表数组,每个链表都已经按升序排列。</p>
<p>请你将所有链表合并到一个升序链表中,返回合并后的链表。</p>
<p> </p>
<p><strong>示例 1:</strong></p>
<pre><strong>输入:</strong>lists = [[1,4,5],[1,3,4],[2,6]]
<strong>输出:</strong>[1,1,2,3,4,4,5,6]
<strong>解释:</strong>链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
</pre>
<p><strong>示例 2:</strong></p>
<pre><strong>输入:</strong>lists = []
<strong>输出:</strong>[]
</pre>
<p><strong>示例 3:</strong></p>
<pre><strong>输入:</strong>lists = [[]]
<strong>输出:</strong>[]
</pre>
<p> </p>
<p><strong>提示:</strong></p>
<ul>
<li><code>k == lists.length</code></li>
<li><code>0 <= k <= 10^4</code></li>
<li><code>0 <= lists[i].length <= 500</code></li>
<li><code>-10^4 <= lists[i][j] <= 10^4</code></li>
<li><code>lists[i]</code> 按 <strong>升序</strong> 排列</li>
<li><code>lists[i].length</code> 的总和不超过 <code>10^4</code></li>
</ul>
<div><div>Related Topics</div><div><li>链表</li><li>分治</li><li>堆(优先队列)</li><li>归并排序</li></div></div><br><div><li>???? 1874</li><li>???? 0</li></div>
*/
//leetcode submit region begin(Prohibit modification and deletion)
import javax.xml.transform.Templates;
import java.util.PriorityQueue;
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists.length==0){
return null;
}
PriorityQueue<ListNode> pq = new PriorityQueue<ListNode>(
lists.length,(a,b)->(a.val - b.val)
);
ListNode dummy = new ListNode(-1);
ListNode p = dummy;
//通过优先级队列, 小根堆, 排序头节点
for(ListNode head : lists){
if(head != null){
pq.add(head);
}
}
while(!pq.isEmpty()){
ListNode temp = pq.poll();
p.next = temp;
//每次排序完一个节点,然后放入这个节点的下一个节点
if(temp.next!=null){
pq.add(temp.next);
}
p = p.next;
}
return dummy.next;
}
}
//leetcode submit region end(Prohibit modification and deletion)
不会,我可以学;落后,我可以追赶;跌倒,我可以站起来!