原题:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
问题描述:
将k个有序链表合并为一个链表。
思路:想到最简单的方法是逐次两两合并,即第一个和第二个先合并,再和第三个合,依次进行。但网上看了看很多大牛用的是优先级队列。因此这里也采用了优先级队列。
<span style="font-size:14px;">/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
struct cmp{
bool operator() (ListNode *l,ListNode *r){
return l->val>=r->val;
}
};//定义结构,重载操作符
ListNode *mergeKLists(vector<ListNode *> &lists) {
int sz = lists.size();
if(sz==0)
return NULL;
ListNode pre(0);//额外定义一个节点
ListNode *res = ⪯// res指针指向pre节点⪯
ListNode *temp(NULL);
priority_queue<ListNode *,vector<ListNode *>,cmp> que;//定义的优先级队列
for(int i=0;i< sz;++i ){
if(lists[i] != NULL){
que.push(lists[i]); //每个链表的首元素地址进队列
}
}
while(!que.empty()){//队列非空时 首元素最小 将其取出
temp = que.top();
que.pop();
res->next = temp;//进行链表连接
res = res->next;
if(temp->next)
que.push(temp->next);//出队列后 向队列中补充出队列元素的下一个元素
}
return pre.next;
}
};</span>
优先级队列:
priority_queue 优先级队列,在这个队列中,所有元素是按优先级排列的。queue也可以认为是个按进入队列的先后做为优先级的优先级队列。总结了一下相关介绍:
priority_queue 对于基本类型的使用方法相对简单,他的模板声明带有三个参数,priority_queue<Type, Container, Functional>,Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list。STL里面默认用的是 vector. 比较方式默认用 operator< 。
具体简单应用可参考此例:
http://blog.csdn.net/morewindows/article/details/6976468
//优先级队列 priority_queue by MoreWindows( http://blog.csdn.net/MoreWindows )
// 支持 empty() size() top() push() pop() 与stack的操作函数全部一样
//by MoreWindows
#include <queue>
#include <list>
#include <cstdio>
using namespace std;
int main()
{
//优先级队列默认是使用vector作容器。
priority_queue<int> a;
priority_queue<int, list<int>> b; //可以这样声明,但无法使用
int i;
//压入数据
for (i = 0; i < 10; i++)
{
a.push(i * 2 - 5);
//b.push(i); //编译错误
}
//优先级队列的大小
printf("%d\n", a.size());
//取优先级队列数据并将数据移出队列
while (!a.empty())
{
printf("%d ", a.top());
a.pop();
}
putchar('\n');
return 0;
}
含结构的优先级队列,可参考此文章的介绍。
http://blog.csdn.net/huangxy10/article/details/8029962