题目:Sort a linked list in O(n log n) time using constant space complexity.

分析:给单链表排序,要求时间复杂度是O(nlogn),空间复杂度是O(1)。时间复杂度为O(nlogn)的排序算法有快速排序和归并排序,

但是,对于单链表来说,进行元素之间的交换比较复杂,但是连接两个有序链表相对简单,因此这里采用归并排序的思路。

编码:

public ListNode sortList(ListNode head) {if(head == null || head.next == null)return head;//找到链表的中间节点,一快一慢两个指针ListNode fast = head;ListNode slow = head;ListNode pre = null; //记录第一部分的最后一个节点//将单链表划分为两部分while(fast != null && fast.next != null){fast = fast.next.next;pre = slow;slow = slow.next;}//将两部分分割开if(pre != null)pre.next = null;//分别对两部分递归排序ListNode l1 = sortList(head);ListNode l2 = sortList(slow);return merge(l1,l2); //归并
        }//归并两个有序序列public ListNode merge(ListNode l1,ListNode l2){if(l1 == null)return l2;if(l2 == null)return l1;ListNode l = new ListNode(-1);ListNode newHead = l;while(l1 != null && l2 != null){ if(l1.val < l2.val){newHead.next = l1; //这里利用单链表的性质,不使用额外的空间,使得空间复杂度为O(1)l1 = l1.next;newHead = newHead.next;} else {newHead.next = l2;l2 = l2.next;newHead = newHead.next;}}if(l1 != null)newHead.next = l1;if(l2 != null)newHead.next = l2;return l.next;}

转载于:https://www.cnblogs.com/mydesky2012/p/5768780.html

148. Sort List (java 给单链表排序)相关推荐

  1. 单链表的应用--对单链表排序

      对单链表进行排序,利用前文写好的链表的框架,在链表类中补充Sort方法. 对单链表排序 一.问题分析 二.代码分析 1.链表类LinkList 2.链表方法Sort 三.测试代码 1.主函数 2. ...

  2. java实现单链表常见操作,java面试题,java初级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 一. ...

  3. 面试题精选:单链表排序也能玩出花来

    今天国庆节,祝大家中秋节快乐,顺便给大家拜个早年[狗头].不过最近还在准备面试的同学们不要浪太狠,还是要好好学习的鸭. 单链表的排序在数据结构类的面试题中简直是集大成者,什么排序.链表.链表删除.添加 ...

  4. 单链表排序----快排 归并排序

    单链表排序----快排 & 归并排序 原文:http://blog.csdn.net/u012658346/article/details/51141288 题目描述:  给定一个乱序的单链表 ...

  5. 单链表排序之直接插入排序

    ****单链表排序之直接插入排序**** /*前段时间刚学会几种排序方法,最近学习了单链表,就用来试试,本篇链表的排序方法<一>讲述的是单链表的直接插入排序:(注意:请仔细看准节点结构体的 ...

  6. python单链表排序_单链表排序之选择排序

    单链表排序是单链表的常见编程任务之一,也是面试中经常出现的题目.单链表排序的关键是交换算法,需要额外考虑.选择排序是比较直观的排序算法之一,这里就使用选择排序实现单链表的排序. C实现代码如下: Li ...

  7. 牛客 - 单链表排序

    单链表排序 **BM12** **单链表的排序** 链接 问题描述 代码 BM12 单链表的排序 链接 单链表的排序_牛客题霸_牛客网 (nowcoder.com) 问题描述 给定一个节点数为n的无序 ...

  8. 单链表排序(交换节点)

    单链表排序(移动节点) 单链表排序利用了选择排序的方式: 创建一个单链表结构体 typedef int data_t;//为了能适应存储其他类型数据,可以将int换成其他数据类型而不通用一个一个更改程 ...

  9. java单链表通讯录_[Java教程]用java实现单链表(菜鸟出征)

    [Java教程]用java实现单链表(菜鸟出征) 0 2016-03-24 14:00:06 package code;class Node{ Node next; int data; public ...

  10. java实现单链表常见操作

    一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashM ...

最新文章

  1. Java项目:酒店管理系统(java+Springboot+Mybatis+Beetl+Layui)
  2. 【编码】-小Ho的防护盾-2016.08.14
  3. React Native 集成
  4. python学习音频-Python学习笔记--音频处理
  5. 浅谈街霸的帧数据 (一):frame data
  6. 得胜php100怎么样,优缺点评测得胜Q麦评价如何?怎么样呢?老司机透漏
  7. ai中如何插入签名_技巧不求人167期 Excel如何打印到1页纸的2种方法 Excel如何插入手写签名...
  8. Pytorch MNIST直接离线加载二进制文件到pytorch
  9. SqlSever分页查询,仅扫描一次表
  10. (25)System Verilog类外约束类内变量
  11. adb如何使用javac编译java程序并且运行
  12. 全面对比 C C++ Java Python
  13. 【区块链开发入门】(二) 以太坊的编程接口
  14. 快冲!淘宝无货源副业,傻瓜式操作,日赚300-500元!!
  15. linux中分号转义字符,Linux职场技术篇-Linux shell中元字符、转义符、通配符的使用方法...
  16. prisma orm_如何使用Node.js和Prisma构建GraphQL服务器
  17. 思科模拟器(cisco) 交换机综合实践(笔记篇)
  18. Janus之自问自答
  19. 测试学习——性能测试(一)
  20. mybatic动态SQL及结果处理

热门文章

  1. IIS启用GZip压缩
  2. Tomcat Linux下自启动
  3. Web应用开发基本技术及思想
  4. c#使用私有构造方法
  5. ubuntu安装python
  6. 如何使用python将二维数组去重呢?
  7. Apache搭建web网站服务器
  8. 第五章 多个消费者监听同一个队列
  9. C#处理Json文件
  10. Kotlin与Android能做什么?答:Android开发优先语言