【LeetCode笔记】148. 排序链表(Java、归并排序、快慢指针、双重递归)
文章目录
- 题目描述
- 思路 & 代码
- 二刷
题目描述
- 难点在于时空复杂度的要求
思路 & 代码
- 转化成:归并排序 + 合并两个有序链表 即可
- 利用快慢指针来拆分成两条链表
- 注意:链表的拆分 & 连接
- 时间复杂度O(n * logn),空间复杂度 O(1)
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode sortList(ListNode head) {if(head == null || head.next == null){return head;}// 1. 快慢指针分出前后两部分,递归ListNode fast = head;ListNode slow = head;while(fast != null && fast.next != null){slow = slow.next;fast = fast.next.next;}// 长度为2的情况特殊考虑if(slow.next == null){slow = head;}// 拆解,递归 O(logn)fast = sortList(slow.next);slow.next = null;slow = sortList(head);// 2. 返回值,进行合并(转化成合并链表)return mergeSortedList(slow, fast);}// 链表合并O(n)ListNode mergeSortedList(ListNode head1, ListNode head2){if(head1 == null){return head2;}if(head2 == null){return head1;}if(head1.val < head2.val){head1.next = mergeSortedList(head1.next, head2);return head1;}else{head2.next = mergeSortedList(head1, head2.next);return head2;}}
}
二刷
- 好吧…记得思路是快慢指针 + 合并有序链表,但是具体咋写确实回想不起来= =
- 其实就是两个函数:快慢指针二分链表 + 合并两个有序链表,双重递归!
class Solution {// 1. 快慢指针二分链表public ListNode sortList(ListNode head) {if(head == null || head.next == null) {return head;}ListNode slow = head, fast = head;while(fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}// 两个的情况,避免无限循环if(slow.next == null) {slow = head;}fast = sortList(slow.next);slow.next = null;slow = sortList(head);return mergeSort(slow, fast);}// 2. 合并两个有序链表 O(n)、O(1)public ListNode mergeSort(ListNode headA, ListNode headB) {if(headB == null) {return headA;}if(headA == null) {return headB;}if(headA.val < headB.val) {headA.next = mergeSort(headA.next, headB);return headA;}else {headB.next = mergeSort(headA, headB.next);return headB;}}
}
【LeetCode笔记】148. 排序链表(Java、归并排序、快慢指针、双重递归)相关推荐
- 【LeetCode】【HOT】148. 排序链表(归并排序)
[LeetCode][HOT]148. 排序链表 文章目录 [LeetCode][HOT]148. 排序链表 package hot;import java.util.Arrays;class Lis ...
- LeetCode Algorithm 148. 排序链表
148. 排序链表 Ideas 链表结构的经典题目. 不过我不想用经典方法做,哎,就是皮. 我把链表元素都拷贝到数组中,然后对数组排序,之后再把排完序之后的值赋回去. 骚的一批. Code Pytho ...
- LeetCode 148. 排序链表(归并排序、快速排序)
文章目录 1. 题目 2. 解题 2.1 归并排序 2.2 快速排序 1. 题目 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1:输入: 4->2-> ...
- leetcode 148. 排序链表(归并排序)
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 . 进阶: 你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗? 示例 1: 输入:head = ...
- 链表排序---迭代版本归并算法 + [leetcode]148. 排序链表
前言: 对于链表来说,排序首选应该是归并算法 维基百科上有归并算法的迭代版本和递归版本 基于数组实现的. https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B ...
- 【LeetCode笔记】287. 寻找重复数(Java、快慢指针、原地、链表)
文章目录 题目描述 思路 & 代码 更新 题目描述 可以理解成数组版本的 环形链表 II 更多详细思路可见以上超链接. 思路 & 代码 如何转化成逻辑上的链表? nums[i] 是 第 ...
- 【LeetCode笔记】142. 环形链表 II(Java、快慢指针)
文章目录 题目描述 思路 & 代码 更新版 三刷 - 再更新 题目描述 相对于环形链表,这里要求找到环的起点 难点在于 O(1),否则可以直接哈希表冲 思路 & 代码 找出快慢指针的路 ...
- 【LeetCode笔记】234. 回文链表(Java、快慢指针、链表)
文章目录 题目描述 思路 & 算法 题目描述 写这道题前最好把206.翻转链表 写了 有空间复杂度的话都好说,不管是新建链表.还是用字符串equals都好做. 思路 & 算法 快慢指针 ...
- 【LeetCode笔记】19.删除链表的倒数第N个结点(Java、快慢指针)
文章目录 题目描述 思路 & 代码 题目描述 重点在于一趟扫描实现 简单的做法:一趟扫描长度,一趟根据长度找到结点删除 思路 & 代码 两种特例情况,见注释 思路:根据N构造两个快慢指 ...
最新文章
- 第四代自动泊车从APA到AVP技术
- 关于TxQBService报的错,腾讯你真牛B啊
- c语言 温探程序,学习第二天,再探C语言
- 英特尔助力金山云带你畅游云端的游戏世界
- 显示客户端接收什么服务器,什么是显示服务器,用来做什么?
- 微信小程序视图层WXML_小程序事件
- sql server 如何在一个数据库中操作另一个数据库中的数据
- 2020定额招投标报价评审办法及案例分享交流会圆满结束
- 机智云智慧烟感物联网解决方案
- 老龙头公司不完全名单
- 冷门短视频带货玩法,零门槛赚钱项目
- GetLastError()函数返回值对照列表
- 再说“恢复被删除的文件”(转)
- Python中getA() 的意思
- Android 开发即时聊天工具 YQ :(五) 发送消息
- 深度解密:软银孙正义如何成为美国硅谷最有权势之人
- (续)SSM整合之springmvc笔记(@RequestMapping注解)(P124-130)
- eclipse 抛 error: could not create the java virtual machine.Error: A fatal exception has occurred解决方法
- iostream 代表着什么意思?
- 信赖域狗腿(dogleg)方法
热门文章
- php7 字符串,php7 参数、整形及字符串处理机制修改实例分析
- centos7调节虚拟机字体_初次安装虚拟机中Ubuntu16.04系统设置的一些小问题(小白教程)...
- 手写字母数据集转换为.pickle文件
- Java并发编程实战~ThreadLocal
- Extract Superclass(提炼超类)
- mysql root mysqld_MySQL how to run mysqld as root
- vue 接口节流_vue防抖节流之v-debounce--throttle使用指南
- 砥志研思SVM(四) 序列最小最优化算法(SMO)论文翻译
- [转载] --- Fastjson1.2.68版及以下全版本远程代码执行漏洞通告
- try-with-resource语法