Leetcode Merge k Sorted Lists

原题:

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 = &pre;// 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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值