C++——合并k个有序链表

对于合并k个有序链表,可以先看一下合并两个有序链表的思想,(点这里

对于k个链表的合并,我们可以基于两个有序链表的合并思想,先将两个链表合并为一个链表,再将得到的结果链表与第三个链表合并为一个链表,以此类推,最终将k个链表合并为一个有序链表。

本篇不在累述这种方法,对于k个有序链表,我们可以考虑优先队列,首先将所有链表入队,然后重载比较操作符,用于构建链表节点的小根堆,依次取出队首节点,得到的新的链表就是一个有序的链表。

这里有两个点需要注意:

1.我们优先队列中的是一个个链表,而每次队首最小值就是当前这个链表的头节点的值,我们获得该头节点,并让队首元素出队,此时,出队的是整个链表,因此我们需要判断当前最小节点的下一个节点是否为空,不为空则说明后面还有节点,我们需要把下一个节点重新入队,参与排序。比如[{1,5,6},{2,4}] 我们让第一个链表出队了,获得了最小的头节点(值为1的),但后面的5-6需要重新入队参与排序。

2.优先队列默认为大根堆,且入队的类型是链表,已定义的排序函数不能满足需求,所以我们需要重载比较函数,虽然是链表类型,但我们每次只需要比较每个链表的当前

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值