Merge k Sorted Lists

priority_queue()讲解:

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 };

      

原文地址:https://www.cnblogs.com/daocaorenblog/p/5264527.html