题目:
给定链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

输入:head = [4,2,1,3]
输出:[1,2,3,4]

输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
分析:

该问题的的输入是一个链表,所以需要找一个最适合链表的排序算法。
对数组进行排序的时间复杂度为O(nlogn),常用的有堆排序,快速排序和归并排序。
如果输入的是一个数组,那么堆排序用数组实现最大堆,该排序算法每次取出其中的最大值,再调整剩余的最大堆,直到所有数字都被取出,第9章已经介绍了如何使用数组实现堆,本质就是将堆中的节点进行编号,数组下标与节点编号对应,可以根据某个数字的下标计算其父节点或子节点在数组中的下标,在数组中只需要O(1)就可以通过下标找到一个数字,但在链表中需要O(n)的时间才能根据节点的编号找到对应的节点。因此不可能直接通过链表实现堆排序,但是如果链表的长度为n就可以创建一个长度为n的数组来实现堆,但是链表的长度为n就可以创建一个长度为n的数组来实现堆,也就是说,通过O(n)的空间代价来实现堆排序。
接下来考虑快速排序,通常快速排序算法首先随机生成一个下标,并以该下标对应的值作为中间值进行分区,如果输入的是数组那么只需要O(1)的时间就能根据下标找到一个数字,如果输入的是链表那么需要O(n)的时间才能根据编号找到对应的节点,快速排序也可以考虑不用随机的中间值,而是始终以某个固定位置的值作为中间值(如链表的头或尾节点),这样可能会出现每次分区时两个子链表的大小都不均衡,从而时间复杂度退化到O(n ^2)。
归并排序如上面图对应的例子2以及代码,由于对链表进行归并排序不需要创建另外一个相同大小的链表来保存合并之后的节点,因此对链表进行进行归并排序的空间效率高,由于代码存在递归调用,递归调用栈的深度为O(logn),空间复杂度为O(logn)。

代码:

public class Solution {public static void main(String[] args) {Solution solution = new Solution();ListNode l1 = new ListNode(-1);ListNode l2 = new ListNode(5);ListNode l3 = new ListNode(3);ListNode l4 = new ListNode(4);ListNode l5 = new ListNode(0);l1.next = l2;l2.next = l3;l3.next = l4;l4.next = l5;ListNode listNode = solution.sortList(l1);System.out.println(listNode);}public ListNode sortList(ListNode head){//        递归终止条件,头节点为空或者头节点下一个节点为空if (head == null  || head.next == null){return head;}ListNode head1 = head;ListNode head2 = split(head);head1 = sortList(head1);head2 = sortList(head2);return merge(head1,head2);}private ListNode merge(ListNode head1, ListNode head2) {ListNode dummy = new ListNode(0);ListNode cur = dummy;while (head1 != null && head2 !=null){if (head1.val <head2.val){cur.next = head1;head1 = head1.next;}else {cur.next = head2;head2 = head2.next;}cur = cur.next;}cur.next = head1 == null ? head2 : head1;return dummy.next;}
//利用快慢指针来将链表平分成两个链表private ListNode split(ListNode head) {ListNode slow = head;ListNode fast = head.next;while (fast !=null && fast.next !=null){slow = slow.next;fast = fast.next.next;}ListNode second = slow.next;slow.next = null;return second;}
}

剑指offer77:链表排序(归并排序)相关推荐

  1. 递增的整数序列链表的插入_每日算法题 | 剑指offer 链表专题 (5)链表中倒数第k个节点...

    点击上方"Jerry的算法和NLP",选择"星标"公众号 重磅干货,第一时间送达 题目 链表中倒数第k个节点 题目要求 输入一个链表的头结点,从尾到头反过来打印 ...

  2. 划水总结剑指offer 链表系列1

    最近在找实习,发现面试题和oj的题差距蛮大的,然后粗略的刷了一遍剑指offer.希望6月中旬前能拿个实习(捂脸哭) 1.首先总结关于链表的题. (1)从尾到头打印一个链表.像我这样的憨憨上来就想 这不 ...

  3. 剑指 offer 链表倒数的第k个数

    快慢指针 快指针线遍历到第k-1个数,然后慢指针在从头开始遍历,这样快慢指针有k-1个间隔,当快指针到链表末尾时,慢指针指的数就是倒数第k个数. public class Solution {     ...

  4. 剑指Offer_14_链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 解题思路 利用两个指针,第一个指针先走k步,然后第二个指针从头开始走,当第一个指针到达最后时,第二个指针指向的结点就是倒数k个.如果第一个指针走到 ...

  5. 剑指offer 链表中倒数第k个节点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 解决方案: public class Solution {public ListNode FindKthToTail(ListNode head, ...

  6. python删除链表的倒数第k个节点,剑指offer 链表中的倒数第K个节点 Python and C++

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路 假设链表中的节点数大于等于k个,那么一定会存在倒数第k个节点,首先使用一个快指针先往前走k步,然后两个指针每次走一步,两个指针之间始终有k的 ...

  7. 剑指Offer——链表中倒数第K个节点

    1.题目描述 输入一个链表,输出该链表中倒数第k个结点. 2.代码实现 package com.baozi.offer;/*** @author BaoZi* @create 2019-07-11-1 ...

  8. 剑指Offer——链表中环的入口结点

    题目描述: 一个链表中包含环,请找出该链表的环的入口结点. 分析: 设置两个指针p1,p2, 两个指针都从链表的头部开始走,不过p1每次走一步,p2每次走两步. 直到相遇的时候,p2走的长度是p1的两 ...

  9. Java解析剑指Offer链表篇(1)

    目录 一.移除链表元素 1.题目要求 2.基本思路 3.代码演示 二.反转链表 1.题目要求 2.基本思路 3.代码实现 三.链表的中间结点 1.题目要求 2.基本思路 3.代码实现 四.链表中倒数第 ...

最新文章

  1. Hive的“rowid”
  2. shell-4.bash的变量:用户自定义变量
  3. UR #13 Yist
  4. Centos7安装Nginx1.14.0
  5. jQuery的实现原理和核心
  6. 拼多多市值一夜蒸发759亿元,黄峥丝毫不慌...
  7. 10月24日云栖精选夜读:2017杭州·云栖大会完美收官 虚拟化平台精彩回顾
  8. 【渝粤题库】陕西师范大学152201 公共行政学
  9. C#WPF多线程控件访问问题
  10. python编程是什么东西_编程python是什么
  11. 嵌入式工程师是青春饭吗?越老越吃香吗?
  12. 怎么用matlab幅频特性曲线怎么模拟,幅频特性曲线的MATLAB模拟
  13. 使用python抓取分析链家网二手房数据
  14. Python数据分析-pandas-数据处理
  15. Elasticsearch 第三方工具包Bboss的简单使用
  16. FFMPEG音频视频开发: 开发本地视频播放器(单线程解码)
  17. linux 文件打包下载到 Windows
  18. android 借助AccessibilityService实现模拟点击功能-微信助手(一)
  19. qgis编辑sld中文标注样式导入Geoserver中文字体乱码
  20. autojs打包的软件报毒

热门文章

  1. 摘金奇缘在线观看迅雷下载
  2. USB otg 学习笔记
  3. jetbrains Rider使用
  4. HDFS中的白名单和黑名单
  5. ROS| cannot resolve host address for machine [localhost]怎么办
  6. Win32_20纯c语言版的打飞机游戏出炉了^_^
  7. GoLang 学习攻略
  8. 香草之岛跟我私奔行不行
  9. Spring实战(第4版)第2章 装配Bean
  10. 浅谈前端的审美与逻辑