博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetCode刷题 23. 合并K个排序链表
阅读量:6452 次
发布时间:2019-06-23

本文共 1647 字,大约阅读时间需要 5 分钟。

原题链接:

https://leetcode-cn.com/problems/merge-k-sorted-lists/description/

题目描述

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

示例:

输入:[  1->4->5,  1->3->4,  2->6]输出: 1->1->2->3->4->4->5->6复制代码

题目解析:

这个题目跟 相似,是其进阶版。最好先去看下的解法。

需要做题者熟悉链表结构和链表的遍历。

思路

思路一

从的基础上,我们已经能够解决两个有序链表的问题,现在是k个有序链表,我们可以将第一二个有序链表进行合并,然后将新的有序链表再继续跟第三个有序链表合并,直到将所有的有序链表合并完成。 这样做思路上是可行的,但是算法的时间复杂度将会很大,具体就不计算了。有兴趣的自己计算下。

思路二

根据思路一,我们是一个一个地将有序链表组成新的链表,这里一个进行了k-1次两个有序链表的合并操作。而且随着新链表越来越大,时间复杂度也会越来越高。 这里有一种简化的方式,可以先将k个有序链表先以2个链表为一组进行合并,得出结果后,再将所有的新有序链表继续上面的方式,2个链表为一组进行合并。直至将所有的有序链表进行合并。 这个思路会比思路一的算法复杂度少一点。

思路三(推荐)

我们换个不一样的思路。我们先遍历一次所有的链表中的元素。然后将元素全部放在一个数组里面。接着对这个数组进行排序,最终将排序后的数组里面的所有元素链接起来。 这种方案的复杂度和代码量会比前集中思路更好,更简单。

空间复杂度:因为需要一个数组,所以需要额外的空间。这个空间的大小就是链表元素的个数 时间复杂度:假设一个是n个元素,对链表进行遍历(n),对数组进行排序(排序算法可以达到nlogn),最终链接所有元素(n),就是 (n+nlogn+n),也就是O(nlogn)。

代码(Python)

思路三代码

def mergeKLists(self, lists):        """        :type lists: List[ListNode]        :rtype: ListNode        """                #遍历链表,将所有链表的所有元素放到一个数组里面        nodeList = []        for i in range(len(lists)):            currentNode = lists[i]            #遍历某个链表            while(currentNode):                nodeList.append(currentNode)                currentNode = currentNode.next                        #根据node的val对数组进行排序          nodeList = sorted(nodeList,key = lambda x:x.val)                #对排序好的数组的元素,一个个地连接成新的链表(这里的tempHead是为了方便设置的头节点)        tempHead = ListNode(0)        currentNode = tempHead        for i in range(len(nodeList)):            currentNode.next = nodeList[i]            currentNode = currentNode.next                    return tempHead.next复制代码

谦言忘语

个人目前只懂一丁点python语法,所以不做语法上的优化,而且整体代码风格效果会尽量跟C语言趋于一致。

转载地址:http://exgwo.baihongyu.com/

你可能感兴趣的文章
Guava包学习-Cache
查看>>
分享打造爆款书的方法,同时聊聊出版图书中的哪些事和哪些坑
查看>>
第8周作业
查看>>
2019-06-12 Java学习日记之JDBC
查看>>
灯箱效果(点击小图 弹出大图集 然后轮播)
查看>>
linux c 笔记 线程控制(二)
查看>>
samba服务器配置
查看>>
SpringMVC+Apache Shiro+JPA(hibernate)整合配置
查看>>
vue.js笔记
查看>>
【Unity3D入门教程】Unity3D之GUI浅析
查看>>
Hive 简单操作
查看>>
湘潭1247 Pair-Pair(树状数组)
查看>>
idea 不能粘贴复制问题
查看>>
IEnumerable<T>
查看>>
IntelliJ IDEA 注册码
查看>>
linux 上面配置apache2的虚拟目录
查看>>
Linux学习总结 (未完待续...)
查看>>
NoSQL数据库探讨 - 为什么要用非关系数据库?
查看>>
String字符串的截取
查看>>
switch函数——Gevent源码分析
查看>>