Merge k Sorted Lists
priority_queue 优先级队列是一个拥有权值概念的单向队列queue,在这个队列中,所有元素是按优先级排列的(也可以认为queue是个按进入队列的先后做为优先级的优先级队列——先进入队列的元素优先权要高于后进入队列的元素)。在计算机操作系统中,优先级队列的使用是相当频繁的,进线程调度都会用到。在STL的具体实现中,priority_queue也是默认以vector作为底部结构,再根据堆的处理规则来调整元素之间的位置。缺省情况下以是max-heap。
priority_queue调用 STL里面的 make_heap(), pop_heap(), push_heap() 算法实现。
priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:
priority_queue<Type, Container, Functional>
其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,
优先队列就是大顶堆,队头元素最大。
如果要用到小顶堆,则一般要把模板的三个参数都带进去。
对于自定义数据类型,则必须自己重载 operator< 或者自己写仿函数
对于自定义时,还需要了解heap的特性:一般对于一个数组:make_heap()可以对数组进行排序,如果是大根堆,则最大的元素在头(begin)
当数组容器 新增加 一个元素放置于末尾,这时可调用push_heap()进行重排,
pop_heap()可以取出最大元素放置于数组末尾,还未删除。
《STL源码剖析》P181有详细例子。
http://www.cnblogs.com/flyoung2008/articles/2136485.html是讲解priority_queue的原理以及仿写。
回到题目:代码如下
1 class Solution { 2 public: 3 struct PNode{ 4 int index; 5 ListNode* pnode; 6 PNode(int _index=0,ListNode* _pnode=NULL):index(_index),pnode(_pnode){} 7 bool operator < (const PNode& x )const 8 { 9 return pnode->val > x.pnode->val; 10 } 11 }; 12 ListNode* mergeKLists(vector<ListNode*>& lists) { 13 priority_queue<PNode> min; 14 ListNode dummy(-1); 15 ListNode*prev =&dummy; 16 for(int i=0;i<lists.size();i++) 17 if(lists[i]!=NULL) 18 { 19 min.push(PNode(i,lists[i])); 20 lists[i]=lists[i]->next; 21 } 22 while(!min.empty()) 23 { 24 prev->next=min.top().pnode; 25 prev=prev->next; 26 int index=min.top().index; 27 min.pop(); 28 if(lists[index]!=NULL) 29 { 30 min.push(PNode(index,lists[index])); 31 lists[index]=lists[index]->next; 32 } 33 } 34 prev->next=NULL; 35 return dummy.next; 36 37 38 } 39 };