算法:链表最快的排序方法,分而治之再合并排序
题目
148. Sort List
Given the head of a linked list, return the list after sorting it in ascending order.
Follow up: Can you sort the linked list in O(n logn)
time and O(1)
memory (i.e. constant space)?
Example 1:
Input: head = [4,2,1,3]
Output: [1,2,3,4]
Example 2:
Input: head = [-1,5,3,4,0]
Output: [-1,0,3,4,5]
Example 3:
Input: head = []
Output: []
Constraints:
The number of nodes in the list is in the range [0, 5 * 104]
.
-105 <= Node.val <= 105
解题思路
如果是数组,时间复杂度解法O(n logn)
比较多的选择,比如快速排序、分而治之再合并排序、堆排序等。但是在链表的世界里,只有分而治之的方法才是最快的。步骤如下:
- 找出中间节点,用单步和双步两个指针可以快速找出,并拆分为左边链表,右边链表;
- 递归调用继续拆分左边链表和右边链表,直到只有null或者只有一个节点为止;
- 逐个合并节点:定义结果空链表,对比合并的两个链表,小的值逐个拼接到结果链表中。
这种接法有个弊端,因为是递归,也就是会有栈溢出的风险。可以加个计数器,如果深度大于10,000 则抛出异常处理。
# Definition for singly-linked list.
class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = next
class SortList:def sortList(self, head: ListNode) -> ListNode:if head == None or head.next == None:return headmid = self.getMid(head)left = self.sortList(head)right = self.sortList(mid)return self.merge(left, right)def merge(self, left: ListNode, right: ListNode) -> ListNode:result = ListNode()dummy = resultwhile left and right:if left.val < right.val:dummy.next = leftleft = left.nextelse:dummy.next = rightright = right.nextdummy = dummy.nextif left:dummy.next = leftif right:dummy.next = rightreturn result.nextdef getMid(self, head: ListNode) -> ListNode:oneStep = Nonewhile head and head.next:if oneStep == None:oneStep = headelse:oneStep = oneStep.nexthead = head.next.nextoneStepNext = oneStep.nextoneStep.next = Nonereturn oneStepNext
算法:链表最快的排序方法,分而治之再合并排序相关推荐
- 合并排序 非递归 java_合并排序-非递归
#include //合并排序非递归--自然合并排序 typedef int Type; using namespace std; void Merge(Type c[],Type d[],int l ...
- 数据结构排序算法(一):排序方法分类和各种排序方法的实现
一. 实验目的 1. 掌握各种常用排序的算法思想: 2. 掌握各种常用排序的算法实现: 3. 掌握各种常用排序时间复杂度,比较各种排序的优缺点. 二.排序算法的归类: 总的排序算法分为以下几类: 1. ...
- java合并排序_Java中的合并排序算法
合并排序算法是一种分而治之的算法.在分而治之的范式中,一个问题被分解成较小的问题,其中每个小问题仍然保留着大问题的所有属性--大小除外.为了解决原始问题,每个部分都是单独解决的,然后这些部分又合并在一 ...
- 合并排序算法排序过程_外部合并排序算法
合并排序算法排序过程 外部分类 (External sorting) External sorting is a technique in which the data is stored on th ...
- list排序方法python_python将list排序的方法有哪些
python将list排序的方法有哪些 发布时间:2020-08-10 15:28:20 来源:亿速云 阅读:79 作者:小新 小编给大家分享一下python将list排序的方法有哪些,相信大部分人都 ...
- java中的五种排序方法_用Java排序的五种有用方法
java中的五种排序方法 Java排序快速概述: 正常的列表: private static List VEGETABLES = Arrays.asList("apple", &q ...
- python列表的排序方法是_Python列表排序 reverse、sort、sorted 操作方法详解
python语言中的列表排序方法有三个:reverse反转/倒序排序.sort正序排序.sorted可以获取排序后的列表.在更高级列表排序中,后两中方法还可以加入条件参数进行排序. reverse() ...
- java中的排序方法,Java中的排序比较方式:自然排序和比较器排序
这里所说到的Java中的排序并不是指插入排序.希尔排序.归并排序等具体的排序算法.而是指执行这些排序算法时,比较两个对象"大小"的比较操作.我们很容易理解整型的 i>j 这样 ...
- python字典排序方法_Python字典的排序方法一则
今天需要对Python的字典进行排序,以获得有效的时间序列,采用了如下方法: 首先生成一个示例字典: >>> range_a = random.sample(range(0, 10) ...
- 基本排序方法实现:选择排序、插入排序、希尔排序
三个基本排序问题的实现,先给出几个公用的比较函数.元素交换函数和显示函数. #include <iostream> using namespace std;#define ElementT ...
最新文章
- 关于VS2012如何安装Windows Phone Toolkit
- python迭代器高级例子
- java map按照value排序_基础:Java集合需要注意的 5 个问题
- solr5.3.1 集成IK中文分词器
- C语言--学生管理系统--(完整代码)
- 能不能用python开发qq_用Python写一个模拟qq聊天小程序的代码实例
- 西瓜书《机器学习》线性模型 一元线性回归公式推导
- 记HTML5 a 标签的一个小坑 1
- 11kw星三角启动延时几秒_带有延时启动的星角接启动方法
- laravel后台可修改配置自动加载
- WCF Error: 客户端配置部分中,找不到引用协定{0}的默认终结点元素……
- Windows 10官方镜像下载教程
- 批量导出docker images 批量导入docker镜像
- 外贸找客户软件:Top Lead Extractor
- 【Python机器学习】回归模型:推土机售价预测
- 学会这三款软件,可以轻松完成录音转文字操作
- WEB攻防-JavaWeb项目
- 结课作业:机械设计制造及其自动化文献综述
- php抢购问题,PHP并发抢购解决方案
- 【毕业设计】单片机机器视觉人体识别小车 - 深度学习 yolo目标检测 人体识别 树莓派
热门文章
- springboot前台页面写Java代码,接收后台数据,SpringBoot整合Thymeleaf的使用,实现非ajax请求后台的数据实现和遍历效果,以及数据的页面展示
- 7 php程序的调试方法_PHP 程序员的调试技术
- tinyhttpd源码分析
- Productivity Power Tools(Visual Studio 扩展) 最新亮点
- 读取jar中资源文件的问题
- 为了方便远程登录写的简单expect脚本
- 最短路径例题(Floyd、Dijkstra)
- 前端-----今日份小练习
- 用计算机探索ppt,《用计算器探索规律 2》ppt课件.ppt
- android+4.0访问网络,Android 中从4.0以后无法在主线程访问网络的解决办法。