@LeetCode合并K个排序链表--Merge k Sorted Lists[C++]

本文介绍了一种使用最小堆数据结构解决LeetCode上合并K个排序链表问题的方法。通过C++中的优先队列实现,将所有链表节点按顺序存储,再逐一取出构建最终排序链表,时间复杂度为O(n),n为所有链表总长度。

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

@LeetCode合并K个排序链表--Merge k Sorted Lists[C++]

问题描述

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:
[1->4->5, 1->3->4, 2->6 ]
输出:
1->1->2->3->4->4->5->6

解决方法及复杂度分析

思路

打算利用 最小堆 数据结构去完成这道题。在 C++ 中,我们利用 优先队列 priority_queue 去实现最小堆。

我们将输入的链表中各个结点压入优先队列中,按照从小到大的顺序保存。

为了避免处理头结点为空的边界问题,我们建立一个哑结点。

只要优先队列不为空,我们依次取出前段结点并删除,当前结点指向此结点,并设置此结点为当前结点。如果下一结点不为空,我们将其压入优先队列中。

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n)
    nk 个有序链表的长度之和。

程序实现

	/**
	 * Definition for singly-linked list.
	 * struct ListNode {
	 * 		int val;
	 * 		ListNode *next;
	 * 		ListNode(int x) : val(x), next(NULL) {}
	 * };
	 */
	 class Solution {
	 public:
	 	ListNode* mergeKLists(vector<ListNode*>& lists) {
	 		auto cmp = [](ListNode*& a, ListNode*& b) {
	 			return a->val > b->val;
	 		};
	 		priority_queue<ListNode*, vector<ListNode*>, decltype(cmp)> q(cmp);
	 		for (auto node : lists) {
	 			if (node) q.push(node);
	 		}
	 		ListNode* dummy = new ListNode(0), *cur = dummy;
	 		while (!q.empty()) {
	 			auto t = q.top(); q.pop();
	 			cur->next = t;
	 			cur = cur->next;
	 			if (cur->next) q.push(cur->next);
	 		}
	 		return dummy->next;
	 	}
	 };

@北京·怀柔 2019.3.8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值