题目

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) 比较多的选择,比如快速排序、分而治之再合并排序、堆排序等。但是在链表的世界里,只有分而治之的方法才是最快的。步骤如下:

  1. 找出中间节点,用单步和双步两个指针可以快速找出,并拆分为左边链表,右边链表;
  2. 递归调用继续拆分左边链表和右边链表,直到只有null或者只有一个节点为止;
  3. 逐个合并节点:定义结果空链表,对比合并的两个链表,小的值逐个拼接到结果链表中。

这种接法有个弊端,因为是递归,也就是会有栈溢出的风险。可以加个计数器,如果深度大于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

算法:链表最快的排序方法,分而治之再合并排序相关推荐

  1. 合并排序 非递归 java_合并排序-非递归

    #include //合并排序非递归--自然合并排序 typedef int Type; using namespace std; void Merge(Type c[],Type d[],int l ...

  2. 数据结构排序算法(一):排序方法分类和各种排序方法的实现

    一. 实验目的 1. 掌握各种常用排序的算法思想: 2. 掌握各种常用排序的算法实现: 3. 掌握各种常用排序时间复杂度,比较各种排序的优缺点. 二.排序算法的归类: 总的排序算法分为以下几类: 1. ...

  3. java合并排序_Java中的合并排序算法

    合并排序算法是一种分而治之的算法.在分而治之的范式中,一个问题被分解成较小的问题,其中每个小问题仍然保留着大问题的所有属性--大小除外.为了解决原始问题,每个部分都是单独解决的,然后这些部分又合并在一 ...

  4. 合并排序算法排序过程_外部合并排序算法

    合并排序算法排序过程 外部分类 (External sorting) External sorting is a technique in which the data is stored on th ...

  5. list排序方法python_python将list排序的方法有哪些

    python将list排序的方法有哪些 发布时间:2020-08-10 15:28:20 来源:亿速云 阅读:79 作者:小新 小编给大家分享一下python将list排序的方法有哪些,相信大部分人都 ...

  6. java中的五种排序方法_用Java排序的五种有用方法

    java中的五种排序方法 Java排序快速概述: 正常的列表: private static List VEGETABLES = Arrays.asList("apple", &q ...

  7. python列表的排序方法是_Python列表排序 reverse、sort、sorted 操作方法详解

    python语言中的列表排序方法有三个:reverse反转/倒序排序.sort正序排序.sorted可以获取排序后的列表.在更高级列表排序中,后两中方法还可以加入条件参数进行排序. reverse() ...

  8. java中的排序方法,Java中的排序比较方式:自然排序和比较器排序

    这里所说到的Java中的排序并不是指插入排序.希尔排序.归并排序等具体的排序算法.而是指执行这些排序算法时,比较两个对象"大小"的比较操作.我们很容易理解整型的 i>j 这样 ...

  9. python字典排序方法_Python字典的排序方法一则

    今天需要对Python的字典进行排序,以获得有效的时间序列,采用了如下方法: 首先生成一个示例字典: >>> range_a = random.sample(range(0, 10) ...

  10. 基本排序方法实现:选择排序、插入排序、希尔排序

    三个基本排序问题的实现,先给出几个公用的比较函数.元素交换函数和显示函数. #include <iostream> using namespace std;#define ElementT ...

最新文章

  1. 关于VS2012如何安装Windows Phone Toolkit
  2. python迭代器高级例子
  3. java map按照value排序_基础:Java集合需要注意的 5 个问题
  4. solr5.3.1 集成IK中文分词器
  5. C语言--学生管理系统--(完整代码)
  6. 能不能用python开发qq_用Python写一个模拟qq聊天小程序的代码实例
  7. 西瓜书《机器学习》线性模型 一元线性回归公式推导
  8. 记HTML5 a 标签的一个小坑 1
  9. 11kw星三角启动延时几秒_带有延时启动的星角接启动方法
  10. laravel后台可修改配置自动加载
  11. WCF Error: 客户端配置部分中,找不到引用协定{0}的默认终结点元素……
  12. Windows 10官方镜像下载教程
  13. 批量导出docker images 批量导入docker镜像
  14. 外贸找客户软件:Top Lead Extractor
  15. 【Python机器学习】回归模型:推土机售价预测
  16. 学会这三款软件,可以轻松完成录音转文字操作
  17. WEB攻防-JavaWeb项目
  18. 结课作业:机械设计制造及其自动化文献综述
  19. php抢购问题,PHP并发抢购解决方案
  20. 【毕业设计】单片机机器视觉人体识别小车 - 深度学习 yolo目标检测 人体识别 树莓派

热门文章

  1. springboot前台页面写Java代码,接收后台数据,SpringBoot整合Thymeleaf的使用,实现非ajax请求后台的数据实现和遍历效果,以及数据的页面展示
  2. 7 php程序的调试方法_PHP 程序员的调试技术
  3. tinyhttpd源码分析
  4. Productivity Power Tools(Visual Studio 扩展) 最新亮点
  5. 读取jar中资源文件的问题
  6. 为了方便远程登录写的简单expect脚本
  7. 最短路径例题(Floyd、Dijkstra)
  8. 前端-----今日份小练习
  9. 用计算机探索ppt,《用计算器探索规律 2》ppt课件.ppt
  10. android+4.0访问网络,Android 中从4.0以后无法在主线程访问网络的解决办法。