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

leetcode148. 排序链表,归并法,分治的集大成之作

leetcode148. 排序链表

题目链接
给你链表的头结点 head ,请将其按升序排列并返回排序后的链表。
示例 1:
在这里插入图片描述
输入:head = [4,2,1,3]
输出:[1,2,3,4]
在这里插入图片描述
输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
示例 3:
输入:head = []
输出:[]
你可以在 O(nlogn) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?

算法核心思想是归并排序(Merge Sort)。归并排序是一种分治算法,它将问题分解成更小的子问题来解决,然后逐步合并子问题的解以得到原问题的解。对于链表排序,归并排序的步骤如下:

分解(Divide):如果链表不为空,将其分成两半。这是通过使用快慢指针实现的,快指针每次移动两个节点,慢指针每次移动一个节点,当快指针到达链表末尾时,慢指针将位于链表的中间位置。

解决(Conquer):递归地对链表的两半分别进行排序。由于链表是线性结构,这一步实际上是在递归地调用sortList函数,直到链表的长度为1或0,这时链表自然是有序的。

合并(Combine):将两个有序的链表合并为一个有序链表。这是通过merge函数实现的,它使用两个指针分别遍历两个链表,比较节点的值,将较小的节点依次添加到新链表中,直到两个链表中的一个被完全遍历。然后将另一个链表的剩余部分直接连接到新链表的末尾。
具体来说:
递归排序函数
sortList(ListNode* head, ListNode* tail) 函数是实际执行排序的递归函数。
如果 head 是 nullptr(空链表),则直接返回 nullptr。
如果 head->next 等于 tail,说明只有一个节点,将 head->next 设置为 nullptr 并返回 head。

寻找中间节点
使用快慢指针法(fast 和 slow)找到链表的中间节点。
slow 每次移动一个节点,而 fast 每次移动两个节点。
当 fast 到达 tail 或链表末尾时,slow 将指向中间节点。

递归拆分链表
找到中间节点后,mid 被设置为 slow。
递归调用 sortList 函数,分别对 head 到 mid(不包括 mid)和 mid 到 tail 的链表进行排序。

合并排序的链表
递归结束后,使用 merge 函数将两个已排序的子链表合并。

合并函数
merge(ListNode* head1, ListNode* head2) 函数负责合并两个有序链表。
创建一个哑节点 dummyHead 作为合并后链表的起点。
使用两个指针 temp1 和 temp2 分别遍历两个输入链表。
比较 temp1 和 temp2 的值,将较小的节点链接到 dummyHead 的后面,并移动相应的指针。
重复这个过程,直到其中一个链表遍历完成。
将未遍历完的链表的剩余部分链接到合并后的链表后面。

返回结果
merge 函数返回合并后链表的头节点,即 dummyHead->next。

具体代码如下:
这段代码中的 tail 指针不是指向链表中的最后一个节点,而是指向最后一个节点的下一个节点。
这就解释了为什么
if (head->next == tail) { head->next = nullptr; return head; }

class Solution {
public:ListNode* sortList(ListNode* head) {return sortList(head, nullptr);}ListNode* sortList(ListNode* head, ListNode* tail) {if (head == nullptr) {return head;}if (head->next == tail) {head->next = nullptr;return head;}ListNode* slow = head, *fast = head;while (fast != tail) {slow = slow->next;fast = fast->next;if (fast != tail) {fast = fast->next;}}ListNode* mid = slow;return merge(sortList(head, mid), sortList(mid, tail));//一直递归到链表长度为1或0}ListNode* merge(ListNode* head1, ListNode* head2) {ListNode* dummyHead = new ListNode(0);ListNode* temp = dummyHead, *temp1 = head1, *temp2 = head2;while (temp1 != nullptr && temp2 != nullptr) {if (temp1->val <= temp2->val) {temp->next = temp1;temp1 = temp1->next;} else {temp->next = temp2;temp2 = temp2->next;}temp = temp->next;}if (temp1 != nullptr) {temp->next = temp1;} else if (temp2 != nullptr) {temp->next = temp2;}return dummyHead->next;}
};

相关文章:

leetcode148. 排序链表,归并法,分治的集大成之作

leetcode148. 排序链表 题目链接 给你链表的头结点 head &#xff0c;请将其按升序排列并返回排序后的链表。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5] 示例 3&…...

一维时间序列信号的小波模极大值分解与重建(matlab R2018A)

数学上称无限次可导函数是光滑的或没有奇异性&#xff0c;若函数在某处有间断或某阶导数不连续&#xff0c;则称函数在此处有奇异性&#xff0c;该点就是奇异点。奇异性反映了信号的不规则程度&#xff0c;因为信号的奇异点和突变部分往往携带者重要信息&#xff0c;因此信号的…...

五分钟“手撕”栈

实现代码放开头&#xff0c;供大家学习与查阅 目录 一、实现代码 二、什么是栈 三、栈的常见操作 底层实现是链表。 入栈 出栈 四、Stack的使用 五、栈的习题 第一题 第二题 第三题 第四题 第五题 第六题 第七题 六、栈、虚拟机栈、栈帧的区别 目录 一、…...

MAC也能玩转3A大作 Crossover使用指南 crossover运行战地5

众所周知&#xff0c;在Mac上你本不该玩游戏。但是如果你实在犯了这个瘾了&#xff0c;你可以使用Parallel Desktop来运行所有Windows程序。但是繁重的虚拟机对磁盘容量提出了较高的要求&#xff0c;&#xff08;可能虚拟机用了大概半年就会到60-80GB这样的大小&#xff09;&am…...

docker私有镜像仓库的搭建及认证

简介&#xff1a; docker私有镜像仓库的搭建及认证 前言 在生产上使用的 Docker 镜像可能包含我们的代码、配置信息等&#xff0c;不想被外部人员获取&#xff0c;只允许内 网的开发人员下载。 Docker 官方提供了一个叫做 registry 的镜像用于搭建本地私有仓库使用。在内部网…...

simCSE句子向量表示(1)-使用transformers API

SimCSE SimCSE: Simple Contrastive Learning of Sentence Embeddings. Gao, T., Yao, X., & Chen, D. (2021). SimCSE: Simple Contrastive Learning of Sentence Embeddings. arXiv preprint arXiv:2104.08821. 1、huggingface官网下载模型 官网手动下载&#xff1a;pri…...

网络运维的重要性

一、介绍 网络运维&#xff0c;英文名为Network Operations (NetOps)&#xff0c;指的是负责维护和管理企业或组织内部网络设备和系统的团队或个人。网络运维的主要目标是确保网络的稳定运行和高效性能&#xff0c;以满足企业或组织的需求。 网络运维工作涵盖了多个方面&…...

还不会使用多线程优化代码执行效率?codefun教你在业务场景中使用CompletableFuture进行优化!

业务场景 我们先来从场景入手&#xff0c;具体的业务是这样的:我们需要从某的省的id去查询这个省份所有的县区&#xff0c;至于什么是县区呢&#xff1f;在DB中我们是这样定义的&#xff0c;也就是字段level 3 的时候&#xff0c;就代表一个县的信息&#xff0c;然后呢&#…...

数据结构-堆(带图)详解

前言 本篇博客我们来仔细说一下二叉树顺序存储的堆的结构&#xff0c;我们来看看堆到底如何实现&#xff0c;以及所谓的堆排序到底是什么 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;数据结构_普通young man的博客-CSDN博客 若有问题 评…...

React Native 之 react-native-share(分享)库 (二十三)

react-native-share 是一个流行的 React Native库&#xff0c;它允许你在移动应用中分享文本、链接、图片等内容到各种社交网络和消息应用。以下是对其原理的简要概述以及代码示例的解析。 代码示例解析 1. 安装 npm install react-native-share # 或者 yarn add react-n…...

JCR一区级 | Matlab实现TCN-BiGRU-MATT时间卷积双向门控循环单元多特征分类预测

JCR一区级 | Matlab实现TCN-BiGRU-MATT时间卷积双向门控循环单元多特征分类预测 目录 JCR一区级 | Matlab实现TCN-BiGRU-MATT时间卷积双向门控循环单元多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现TCN-BiGRU-MATT时间卷积双向门控循环单元多…...

游戏心理学Day01

心理学 心理学是一门研究心理过程和行为及其如何受有机体的生理&#xff0c;心理状态和外部影响的科学 心理学不是常识的代名词&#xff0c;心理学分为基础&#xff0c;心理学和应用心理学基础&#xff0c;心理学研究的目的在于描述&#xff0c;解释&#xff0c;预测和控制行…...

错误模块路径: ...\v4.0.30319\clr.dll,v4.0.30319 .NET 运行时中出现内部错误,进程终止,退出代码为 80131506。

全网唯一解决此BUG的文章&#xff01;&#xff01;&#xff01; 你是否碰到了以下几种问题&#xff1f;先说原因解决思路具体操作1、首先将你C:\Windows\Microsoft.NET\文件夹的所有者修改为你当前用户&#xff0c;我的是administrator。2、修改当前用户权限。3、重启电脑4、删…...

005 CentOS 7.9 RabbitMQ安装及配置

https://github.com/rabbitmq/rabbitmq-server/releases https://www.rabbitmq.com/docs/download https://packagecloud.io/rabbitmq/rabbitmq-server https://www.erlang-solutions.com/downloads/ https://www.erlang.org/ 文章目录 卸载erlerl版本安装与下载版本不匹配正…...

Xcode 15 libarclite 缺失问题

升级到Xcode 15运行项目报错&#xff0c;报错信息如下&#xff1a; SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a; try increasing the minimum d…...

绘画智能体分享

这是您请求的故宫雪景图&#xff0c;角落有一只可爱的胖猫&#xff0c;采用了水墨画风格&#xff0c;类似于张大千的作品。希望您喜欢这幅画&#xff01; &#x1f3a8; 选项 1【转变风格】——将这幅画转变为梵高的后印象派风格&#xff0c;增添一些梵高特有的笔触和色彩。 &…...

7_2、C++程序设计进阶:数据共享

数据与函数 数据与函数局部变量全局变量类的数据成员 类的静态成员静态数据成员静态函数成员 友元友元函数友元类 函数之间实现数据共享有以下几种方式&#xff1a;局部变量、全局变量、类的数据成员、类的静态成员和友元。 如何共享局部变量呢&#xff1f; 在主调函数和被调…...

d2-crud-plus 使用小技巧(五)—— 搜索时间(或下拉列表)后,点击X清除按钮后返回值为null,导致异常

问题 使用vue2elementUId2-crud-plus&#xff0c;时间组件自动清除按钮&#xff0c;点击清除按钮后对应的值被设置为null&#xff0c;原本应该是空数组&#xff08;[]&#xff09;&#xff0c;导致数据传到后端后报错。不仅适用于搜索&#xff0c;表单一样有效果。 解决方法 …...

ChatGPT成知名度最高生成式AI产品,使用频率却不高

5月29日&#xff0c;牛津大学、路透社新闻研究所联合发布了一份生成式AI&#xff08;AIGC&#xff09;调查报告。 在今年3月28日—4月30日对美国、英国、法国、日本、丹麦和阿根廷的大约12,217人进行了调查&#xff0c;深度调研他们对生成式AI产品的应用情况。 结果显示&…...

R19 NR移动性增强概况

随着5G/5G-A技术不断发展和业务需求的持续增强&#xff0c;未来网络的部署将不断向高频演进。高频小区的覆盖范围小&#xff0c;用户将面临更为频繁的小区选择、重选、切换等移动性过程。 为了提升网络移动性能和保障用户体验&#xff0c;移动性增强一直是3GPP的热点课题。从NR…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...