148. Sort List (java 给单链表排序)
题目: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;
}
148. Sort List (java 给单链表排序)的更多相关文章
- Java实现单链表的各种操作
Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素 4.实现链表的反转 5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...
- 使用java实现单链表(转载自:https://www.cnblogs.com/zhongyimeng/p/9945332.html)
使用java实现单链表----(java中的引用就是指针)转载自:https://www.cnblogs.com/zhongyimeng/p/9945332.html ? 1 2 3 4 5 6 7 ...
- java实现单链表的增删功能
JAVA 实现单链表的增删功能 package linked; class LinkedTable{ } public class LinkedTableTest { public static vo ...
- JAVA数据结构——单链表
链表:一. 顺序存储结构虽然是一种很有用的存储结构,但是他有如下几点局限性:1. 因为创造线性表的时候已经固定了空间,所以当需要扩充空间时,就需要重新创建一个地址连续的更大的存储空间.并把原有的数据元 ...
- java实现单链表的增删改以及排序
使用java代码模拟单链表的增删改以及排序功能 代码如下: package com.seizedays.linked_list; public class SingleLinkedListDemo { ...
- Java实现单链表的快速排序和归并排序
本文描述了LeetCode 148题 sort-list 的解法. 题目描述如下: Sort a linked list in O(n log n) time using constant space ...
- 用java实现单链表
对于一个单链表来说,要求有最基本的数据节点以及一些重要的方法. 方法应该有增删改查.定位.输出.获取链表长度.排序.链表读入.链表输出.下面是我用java写的单链表 public class List ...
- Java数据结构--单链表
#java学习经验总结------单链表的建立与结点的增删 在该链表结点有data数据,并且还有cpu,分给cpu随机的时间片,根据时间片大小进行结点data的排序 链表结点的建立 class Lin ...
- java实现单链表常见操作
一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashM ...
随机推荐
- 【C#】异步的用法
1. C#5.0 加入了async, await关键字. async是在声明异步方法时使用的修饰符, 声明放在返回值之前即可,await表达式则负责消费异步操作, 不能出现在catch或finally ...
- 洛谷P1803 凌乱的yyy dp
我要日更嘤嘤嘤>_< 原题戳>>https://www.luogu.org/problem/show?pid=1803<<(其实是戳不动的,复制粘贴吧) 题目背景 ...
- centos nginx 中安装ssl证书 以及在项目中的使用
今天阿里云的证书到期了,重新申请了一个,下面是从申请到安装以及结合项目使用的过程: 1.登录阿里云 2.在左侧找到SSL证书 3.申请免费的证书 4.下载证书 5.根据说明配置nginx 6.在项 ...
- EsayUI + MVC + ADO.NET(项目架构)
项目目录 1.项目架构: http://www.cnblogs.com/liuxiaoji/p/3922506.html 2.仓储基础接口: http://www.cnblogs.com/liu ...
- python 正则表达式规则收集
python正则表达式基本元字符 . 通配符,匹配所有字符 ^abc 匹配以abc开始的字符串 abc$ 匹配以abc结尾的字符串 [abc] 匹配字符集合 [A-Z0-9] 匹配字符范围 ...
- 学习笔记40—endnote点点滴滴
1.在endnote中,如果引用书籍时,需要作者名称后面加“逗号”,作者名称才不会缩写, 比如: 1) 加“逗号”之前: 2)加“逗号”之后
- 学习笔记6—pandas中ix,loc,iloc有什么区别?
直接看例子: >>> data = pd.Series(np.arange(10), index=[49,48,47,46,45, 1, 2, 3, 4, 5]) >>& ...
- HDU 4812 D Tree
HDU 4812 思路: 点分治 先预处理好1e6 + 3以内到逆元 然后用map 映射以分治点为起点的链的值a 成他的下标 u 然后暴力跑出以分治点儿子为起点的链的值b,然后在map里查找inv[b ...
- Codeforces 931F - Teodor is not a liar!
931F - Teodor is not a liar! 思路: 最长上升子序列 先差分数组染色 如果存在一个点,被所有区间包含,那么这张图一定是山峰状,如下图: 那么只要分别从前和从后找一个最长非严 ...
- 网络cmd命令
1.ping ip; 检测IP地址是否相通 ping命令的常用参数选项 ping IP -t:连续对IP地址执行ping命令,直到被用户以Ctrl+C中断. ping IP -l 2000:指定pin ...