合并K个有序链表-堆的使用

本博客探讨如何高效地合并k个已排序的链表。通过利用堆(priority_queue)的数据结构,可以在O(lgk)的时间复杂度内找到最小节点并将其添加到合并后的链表中。这种方法确保了合并后的链表依然有序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有k个有序的链表(按照结点的val值升序),请将它们全部合并为一个新的有序的链表。返回合并后链表的头结点。

题目来源:http://www.itint5.com/oj/#21

推荐指数:※※

K个链表本来都是有序的,现在要将K个链表合并成一个。

关键在于k个链表元素之间的比较。

例如:k个链表的第一个元素比较之后,将最小的那个节点X放入新的链表当中。X=X->next; 现在就是要高效的将X加入到上次的结果当中。很容易知道,heap可以在O(lgk)时间里完成。

使用C++的priority_queue,它本身就是一个堆的结构。

typedef struct ListNode {
  int val;
  ListNode *next;
}ListNode;

//lists包含k个链表的头结点,返回合并后链表头结点
struct cmp{
    bool operator()(ListNode * a, ListNode * b){
        return a->val>b->val;
    }
};
ListNode* merge(vector<ListNode*> &lists) {
    ListNode* plist=NULL;
    priority_queue<ListNode*,vector<ListNode* >,cmp> q;
	int i,j;
	if(lists.size()>0){
		for(i=0;i<lists.size();i++){
			if(lists[i]!=NULL)
				q.push(lists[i]);
		}
		if(!q.empty()){
			plist=q.top();
			q.pop();
			ListNode *nlist=plist;
			ListNode *tmp_node=nlist;
			if(tmp_node!=NULL){
				tmp_node=tmp_node->next;
				if(tmp_node!=NULL)
					q.push(tmp_node);
			}
			while(!q.empty()){
				ListNode *tmp_node=q.top();
				q.pop();
				nlist->next=tmp_node;
				nlist=nlist->next;
				if(tmp_node!=NULL){
					 tmp_node=tmp_node->next;
					 if(tmp_node!=NULL)
						 q.push(tmp_node);
				}
			}
		}
	}
    return plist;
}

堆的实现可以看: http://blog.youkuaiyun.com/zhu_liangwei/article/details/8204906第7条

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值