力扣——合并k个升序链表

本文介绍了如何通过暴力解法和优先级队列优化算法解决合并k个升序链表的问题,暴力法时间复杂度为O(mn^2),而使用优先级队列可以降低到O(nlogk)。作者提供了C++代码实现,展示了如何构造和操作优先级队列以高效地合并链表。
摘要由CSDN通过智能技术生成

题目解析

题目链接

首先先把题目连接给大家奉上题目链接

题目解析

在这里插入图片描述
严格来说这个题目是非常容易理解的相信大家有了合并两个升序链表来理解这个题目就会非常容易理解了。这个题目的意思就是现在有k个升序链表要求你将这k个升序链表进行合并合并成为一个升序链表。

算法讲解

暴力解法

首先看到一个算法题目我们依然是分为暴力和优化两个步骤看到这个题目有什么暴力解法呢?这里我门可以把当时两两链表合并这个题目的思想运用过来我们合并两个链表的时候是用两个指针那么我们合并多个链表的时候也可以两两合并啊。
比如这里的这个例子如下图
在这里插入图片描述
那么这样子的话我们的时间复杂度如何呢?

我们假设每个链表的节点个数为n总共有m个链表那么每一次都需要两两比对,并且每一次新的链表长度都会增加,因此最终的时间复杂度是O(mn^2)这个时间复杂度是很可怕的,因为如果m和n的数字比较接近的话那么时间复杂度就直逼三次方了。因此需要优化

利用优先级队列进行优化

利用优先级队列进行优化,我们可以将这些链表的头节点放入一个优先级队列中之后每当出去一个节点就将出去的这个节点的next节点放入优先级队列中。

代码解析

class Solution {
public:
	struct cmp
	{
		bool operator()(ListNode* n1,ListNode* n2) {
			return n1->val > n2->val;
		}
	};
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        priority_queue<ListNode*, vector<ListNode*>, cmp>pr;

		for (auto l : lists) {
			if(l)pr.push(l);
		}

		ListNode* ret = new ListNode(0);
		ListNode* per = ret;
		
		while (!pr.empty()) {
			ListNode* ne = pr.top();
			pr.pop();
			if (ne->next)pr.push(ne->next);
			per->next = ne;
			per = ne;
		}

        per=ret->next;
        delete(ret);
        return per;
    }
};

那么我们看一下这个代码首先就是创建一个优先级队列,之后将每个链表的头节点放入堆中

 priority_queue<ListNode*, vector<ListNode*>, cmp>pr;

		for (auto l : lists) {
			if(l)pr.push(l);
		}

当完成上面的第一步后我们就要开始下一步从堆中出去并且当出去的这个节点的下一个节点不为空时就把他的next放入堆中

while (!pr.empty()) {
			ListNode* ne = pr.top();
			pr.pop();
			if (ne->next)pr.push(ne->next);
			per->next = ne;
			per = ne;
		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值