算法:合并k个有序链表

题目:合并k个有序链表

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

示例:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists

分析

要解决这个问题,首先要解决合并2个有序链表的方法,并以此作为拓展来实现合并K个有序链表。关于合并两个有序链表这里不再描述,可以去看我的相关文章。

这里提供两个思路,一是不断通过两两合并的方式把全部链表合并起来;二是每次从所有链表中选出最小的那个加到链表尾部。

思路一:这个思路很清晰,但是要注意一点,不能够一条一条合进来,要进行分治法,先两两合并后,再把剩下的两两合并。例如1234,先2+1,再3+4,最后再3+7(这里的1234指的是4个链表)。

思路二:每次从所有节点中抽取一个节点出来。这里可以使用一个优先队列来维护k个数据。每次从队列中拿走一个节点后就把该节点的下一节点放进去。这样的好处就是,优先队列可以通过效率比较高的算法排序(堆算法),比我们一个个找的效率要高,坏处就是要占用额外的空间。下面的解答我没有使用队列,直接一个个去查找,读者可以自行尝试。

解答

class ListNode(var `val`: Int) {
   
    var next: ListNode? = null
}
解答一
fun mergeKLists(lists: Array<ListNode?>): ListNode? {
   
    val listArray = ArrayList<ListNode>()
    for (node in lists){
   
        if (node!=null) listArray.add(node)
    }
    if (listArray
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值