优先队列:维持一个有序的队列
23. 合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6
解法:维持一个最小堆/队列
1.构建一个最小堆,把所有链表的元素,全部塞进去
2.重新构建一条链表即可
/**
* Definition for a singly-linked list.
* class ListNode {
* public $val = 0;
* public $next = null;
* function __construct($val) { $this->val = $val; }
* }
*/
class Solution {
function mergeKLists($lists) {
$mh = new SplMinHeap(); //维持一个最小堆
while ($lists) { //依次取出每一个链表
$head = array_shift($lists);
while ($head) { //遍历每一个链表
$mh->insert($head->val); //将链表中的值压入最小堆中
$head = $head->next;
}
}
//重构链表即可
$dummyHead = new ListNode(null);
$curNode = $dummyHead;
while ($mh->valid()) {
$newNode = new ListNode($mh->current());
$curNode->next = $newNode;
$curNode = $curNode->next;
$mh->next();
}
return $dummyHead->next;
}
}
LeetCode.347.前K个高频元素道理一样