当前位置: 首页 > news >正文

【LeetCode: 148. 排序链表 + 链表 + 归并排序】

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述
在这里插入图片描述

🍔 目录

    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • ⚡ 链表 + 归并排序
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚩 题目链接

  • 148. 排序链表

⛲ 题目描述

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

示例 1:

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

输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
示例 3:

输入:head = []
输出:[]

提示:

链表中节点的数目在范围 [0, 5 * 104] 内
-105 <= Node.val <= 105

进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?

🌟 求解思路&实现代码&运行结果


⚡ 链表 + 归并排序

🥦 求解思路
  1. 如果题目没有对于时间复杂度和空间复杂度的限制,那么我们可以先额外开辟一个数组先来记录链表的数值,然后排序后,再次重新建立链表。
  2. 但是,如果按照该题目的限制要求,在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序,我们就只能通过归并排序来求解了。
  3. 首先,通过快慢指针,先分别以每个链表的中点位置进行划分,然后再对划分后的链表进行有序合并。得到最终的有序链表。
  4. 有了基本的思路,接下来我们就来通过代码来实现一下。
🥦 实现代码
/*** 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;ListNode left = head, mid = head.next, right = head.next.next;while (right != null && right.next != null) {left = left.next;mid = mid.next;right = right.next.next;}// 断连left.next = null;return merge(sortList(head), sortList(mid));}public ListNode merge(ListNode pHead1, ListNode pHead2) {// 一个已经为空了,直接返回另一个if (pHead1 == null)return pHead2;if (pHead2 == null)return pHead1;// 加一个表头ListNode head = new ListNode(0);ListNode cur = head;// 两个链表都要不为空while (pHead1 != null && pHead2 != null) {// 取较小值的结点if (pHead1.val <= pHead2.val) {cur.next = pHead1;// 只移动取值的指针pHead1 = pHead1.next;} else {cur.next = pHead2;// 只移动取值的指针pHead2 = pHead2.next;}// 指针后移cur = cur.next;}// 哪个链表还有剩,直接连在后面if (pHead1 != null)cur.next = pHead1;elsecur.next = pHead2;// 返回值去掉表头return head.next;}}
🥦 运行结果

在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

相关文章:

  • ffmpeg 实用命令 -- 设置预览图
  • 【.NET Core】深入理解任务并行库 (TPL)
  • 使用ajax异步获取下拉列表的值
  • 单片机中MCU跑RTOS相比裸机的优势
  • 网安渗透攻击作业(1)
  • 不停机迁移,TDengine 在 3D 打印技术中的“焕新”之路
  • Linux的权限(三)
  • 数据库学习命令总结(持续更新)
  • 倍增算法笔记
  • python07-Python的数字类型之浮点类型
  • 如何解决服务器端口被占用的问题,减少带来的影响
  • 如何在Vue项目中应用TypeScript?
  • msvcp140.dll丢失是什么意思?找不到msvcp140.dll哪个解决方法简单
  • 【webrtc】neteq测试工程
  • Linux(2)——Linux中的Vim编辑器:从入门到精通
  • 2017年终总结、随想
  • cookie和session
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Phpstorm怎样批量删除空行?
  • Python实现BT种子转化为磁力链接【实战】
  • Vue 动态创建 component
  • 分布式事物理论与实践
  • 关于extract.autodesk.io的一些说明
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 在Docker Swarm上部署Apache Storm:第1部分
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​批处理文件中的errorlevel用法
  • #数学建模# 线性规划问题的Matlab求解
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (四)图像的%2线性拉伸
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一) springboot详细介绍
  • .form文件_一篇文章学会文件上传
  • .NET Framework 4.6.2改进了WPF和安全性
  • .net framework profiles /.net framework 配置
  • .Net Memory Profiler的使用举例
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net 后台导出excel ,word
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET命名规范和开发约定
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • @Not - Empty-Null-Blank
  • [20170713] 无法访问SQL Server
  • [C#]winform部署yolov5-onnx模型
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型
  • [C++]Leetcode17电话号码的字母组合
  • [datastore@cyberfear.com].Elbie、[thekeyishere@cock.li].Elbie勒索病毒数据怎么处理|数据解密恢复
  • [IE技巧] IE 中打开Office文件的设置
  • [LeetCode]-Pascal's Triangle III 杨辉三角问题