文章目录

  • 题目描述
  • 思路 & 代码
    • 二刷

题目描述

  • 难点在于时空复杂度的要求

思路 & 代码

  • 转化成:归并排序 + 合并两个有序链表 即可
  • 利用快慢指针来拆分成两条链表
  • 注意:链表的拆分 & 连接
  • 时间复杂度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、归并排序、快慢指针、双重递归)相关推荐

  1. 【LeetCode】【HOT】148. 排序链表(归并排序)

    [LeetCode][HOT]148. 排序链表 文章目录 [LeetCode][HOT]148. 排序链表 package hot;import java.util.Arrays;class Lis ...

  2. LeetCode Algorithm 148. 排序链表

    148. 排序链表 Ideas 链表结构的经典题目. 不过我不想用经典方法做,哎,就是皮. 我把链表元素都拷贝到数组中,然后对数组排序,之后再把排完序之后的值赋回去. 骚的一批. Code Pytho ...

  3. LeetCode 148. 排序链表(归并排序、快速排序)

    文章目录 1. 题目 2. 解题 2.1 归并排序 2.2 快速排序 1. 题目 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1:输入: 4->2-> ...

  4. leetcode 148. 排序链表(归并排序)

    给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 . 进阶: 你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗? 示例 1: 输入:head = ...

  5. 链表排序---迭代版本归并算法 + [leetcode]148. 排序链表

    前言: 对于链表来说,排序首选应该是归并算法 维基百科上有归并算法的迭代版本和递归版本 基于数组实现的. https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B ...

  6. 【LeetCode笔记】287. 寻找重复数(Java、快慢指针、原地、链表)

    文章目录 题目描述 思路 & 代码 更新 题目描述 可以理解成数组版本的 环形链表 II 更多详细思路可见以上超链接. 思路 & 代码 如何转化成逻辑上的链表? nums[i] 是 第 ...

  7. 【LeetCode笔记】142. 环形链表 II(Java、快慢指针)

    文章目录 题目描述 思路 & 代码 更新版 三刷 - 再更新 题目描述 相对于环形链表,这里要求找到环的起点 难点在于 O(1),否则可以直接哈希表冲 思路 & 代码 找出快慢指针的路 ...

  8. 【LeetCode笔记】234. 回文链表(Java、快慢指针、链表)

    文章目录 题目描述 思路 & 算法 题目描述 写这道题前最好把206.翻转链表 写了 有空间复杂度的话都好说,不管是新建链表.还是用字符串equals都好做. 思路 & 算法 快慢指针 ...

  9. 【LeetCode笔记】19.删除链表的倒数第N个结点(Java、快慢指针)

    文章目录 题目描述 思路 & 代码 题目描述 重点在于一趟扫描实现 简单的做法:一趟扫描长度,一趟根据长度找到结点删除 思路 & 代码 两种特例情况,见注释 思路:根据N构造两个快慢指 ...

最新文章

  1. 第四代自动泊车从APA到AVP技术
  2. 关于TxQBService报的错,腾讯你真牛B啊
  3. c语言 温探程序,学习第二天,再探C语言
  4. 英特尔助力金山云带你畅游云端的游戏世界
  5. 显示客户端接收什么服务器,什么是显示服务器,用来做什么?
  6. 微信小程序视图层WXML_小程序事件
  7. sql server 如何在一个数据库中操作另一个数据库中的数据
  8. 2020定额招投标报价评审办法及案例分享交流会圆满结束
  9. 机智云智慧烟感物联网解决方案
  10. 老龙头公司不完全名单
  11. 冷门短视频带货玩法,零门槛赚钱项目
  12. GetLastError()函数返回值对照列表
  13. 再说“恢复被删除的文件”(转)
  14. Python中getA() 的意思
  15. Android 开发即时聊天工具 YQ :(五) 发送消息
  16. 深度解密:软银孙正义如何成为美国硅谷最有权势之人
  17. (续)SSM整合之springmvc笔记(@RequestMapping注解)(P124-130)
  18. eclipse 抛 error: could not create the java virtual machine.Error: A fatal exception has occurred解决方法
  19. iostream 代表着什么意思?
  20. 信赖域狗腿(dogleg)方法

热门文章

  1. php7 字符串,php7 参数、整形及字符串处理机制修改实例分析
  2. centos7调节虚拟机字体_初次安装虚拟机中Ubuntu16.04系统设置的一些小问题(小白教程)...
  3. 手写字母数据集转换为.pickle文件
  4. Java并发编程实战~ThreadLocal
  5. Extract Superclass(提炼超类)
  6. mysql root mysqld_MySQL how to run mysqld as root
  7. vue 接口节流_vue防抖节流之v-debounce--throttle使用指南
  8. 砥志研思SVM(四) 序列最小最优化算法(SMO)论文翻译
  9. [转载] --- Fastjson1.2.68版及以下全版本远程代码执行漏洞通告
  10. try-with-resource语法