LeetCode148.排序链表
题目
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
示例

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

输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
输入:head = []
输出:[]
思路
对于链表排序我们可以使用链表的归并排序(Merge Sort)算法。下面是整体的思路:
-
归并排序的核心思想:归并排序是一种分治算法,首先将待排序的链表分成两部分,然后分别对这两部分进行排序,最后将排好序的两部分链表合并起来。
-
mergeSort 函数:这个函数是归并排序的入口,负责调用递归排序的函数 mergeSort,并返回排好序的链表。在 mergeSort 中,首先判断链表是否为空或只有一个节点,如果是,则直接返回原链表。然后找到链表的中间节点 mid,将链表分成左右两部分,分别以 head 和 mid->next 开始。然后分别对左右两部分链表调用 mergeSort 递归排序,最终通过 merge 函数将排好序的两部分链表合并。
-
findMid 函数:这个函数用
快慢指针的方法找到链表的中间节点,快指针每次移动两步,慢指针每次移动一步,当快指针到达链表末尾时,慢指针指向的节点即为中间节点。 -
merge 函数:这个函数用于合并两个有序链表。创建一个虚拟头节点 dummyHead 和一个指针 cur,遍历两个链表的节点,根据节点值的大小依次连接到 cur->next 上,然后将 cur 移动到下一个节点。最后,将剩余未遍历完的链表连接到 cur->next 上。返回虚拟头节点的下一个节点即为合并后的有序链表。
综上所述,这段代码通过归并排序算法对链表进行排序,利用分治和合并的思想,最终得到一个按升序排列的链表。
Code
class Solution {
public:ListNode* sortList(ListNode* head) {return mergeSort(head);}ListNode* mergeSort(ListNode* head) {if (!head || !head->next) return head;ListNode* mid = findMid(head);ListNode* l1 = head;ListNode* l2 = mid->next;mid->next = nullptr;l1 = mergeSort(l1);l2 = mergeSort(l2);return merge(l1, l2);}ListNode* findMid(ListNode* head) {ListNode *slow = head, *fast = head;while (fast->next && fast->next->next) {slow = slow->next;fast = fast->next->next;}return slow;}ListNode* merge(ListNode* l1, ListNode* l2) {// l1 >= l2长度ListNode* dummyHead = new ListNode();ListNode* cur = dummyHead;while (l1 && l2) {if (l1->val <= l2->val) {cur->next = l1;l1 = l1->next;}else {cur->next = l2;l2 = l2->next;}cur = cur->next;}cur->next = l1 ? l1 : l2;return dummyHead->next;}
};
相关文章:
LeetCode148.排序链表
题目 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 输入:head [4,2,1,3] 输出:[1,2,3,4] 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5] 输入:head [] 输出:[] 思路…...
qt学习:网络调试助手客户端+服务端
目录 客户端 步骤 ui界面配置编辑 添加头函数,类成员数据,类成员函数 添加模块 构造函数 连接按钮 收到来自服务器的数据触发 发送按钮 断开按钮 向textEditRev文本编辑器中插入指定颜色的文本 服务端 步骤 ui界面配置 添加头函数&…...
C语言拾遗
函数的地址传递: 函数体内部想要修改函数体外部变量值的时候,使用地址传递 int set(int *pa) {//功能 } int main(void) {int a0;set(&a);//此时a的值经过set函数的修改,且传递到了main函数 } 函数体内想修改函数体外部指针的值的时候…...
大唐杯学习笔记:Day4
1.1NR帧结构 5G NR中,依然采用一帧10ms,并将一帧分为10子帧,每个子帧为1ms。每个子帧包含几个时隙(slot),每个时隙由14个OFDM符号构成(在常规CP下)。 μ \mu μ Δ f 2 μ ∗ 15 [ K H Z ] \Delta f2^{\mu}*15[KHZ] Δf2μ∗15[KHZ]Cyclic prefix015Normal130Normal260Normal…...
docker基线安全修复和容器逃逸修复
一、docker安全基线存在的问题和修复建议 1、将容器的根文件系统挂载为只读 修复建议: 添加“ --read-only”标志,以允许将容器的根文件系统挂载为只读。 可以将其与卷结合使用,以强制容器的过程仅写入要保留的位置。 可以使用命令&#x…...
ZooKeeper概述
ZooKeeper是一个开源的分布式协调服务,由Apache Software Foundation维护。它主要用于解决分布式应用中遇到的一些最常见问题,如命名服务、状态同步、配置管理和群集管理等。通过提供一套简单但强大的API,ZooKeeper使得从简单的锁服务到复杂的…...
【sgCollapseBtn】自定义组件:底部折叠/展开按钮
特性: 支持自定义折叠状态支持自定义标签名称 sgCollapseBtn源码 <template><div :class"$options.name" click"show !show" :placement"placement"><div class"collapse-btns"><div class"c…...
如何根据玩家数量和游戏需求选择最合适的服务器配置?
根据玩家数量和游戏需求选择最合适的服务器配置,首先需要考虑游戏的类型、玩家数量、预计的在线时间以及对内存和CPU性能的需求综合考虑。对于大型多人在线游戏,如MMORPG或MOBA等,由于需要更多的CPU核心数来支持更复杂的游戏逻辑和处理大量数…...
问题解决:各版本的vc_redist下载地址 缺少msvcr100.dll、msvcr120.dll、msvcr140.dll
Visual C Redistributable for Visual Studio各版本的官方链接。解决缺少msvcr100.dll、msvcr120.dll、msvcr140.dll的问题。 下面全部为官方链接: Microsoft Visual C Redistributable 2019 x86: https://aka.ms/vs/16/release/VC_redist.x86.exe x64: https://ak…...
182基于matlab的半监督极限学习机进行聚类
基于matlab的半监督极限学习机进行聚类,基于流形正则化将 ELM 扩展用于半监督,三聚类结果可视化输出。程序已调通,可直接运行。 182matlab ELM 半监督学习 聚类 模式识别 (xiaohongshu.com)...
C语言数组案例编程
1. 编写一个程序实现:从键盘输入15个整数存入数组,然后统计其中正整数的个数。 【要求】采用函数编程 #include<stdio.h> void input(int a[],int n) {int i; for(i0;i<n;i)scanf("%d",&a[i]); }int positiveNum(int a[],int n…...
NLP - 依存句法分析、句子歧义
1. 语言结构的两种观点 Constituency phrase struct grammar context-free grammars(CFGs)Dependency structure 对于context-free grammars(CFGs) 短语结构(Constituency):短语结构语法是一种描述语言结构的方法,它将句子划…...
vue实现图片上传至oss,返回url插入数据库,最后在前端页面上回显图片
vue前端上传图像 上传图片 使用上传图片的upload组件 <el-form-item label"设备图像"><el-upload//设置class样式class"avatar-uploader"//绑定上传路径:action"uploadUrl"//携带token值:headers"tokenInfo":show-file-lis…...
C++学习笔记:set和map
set和map set什么是setset的使用 关联式容器键值对 map什么是mapmap的使用map的插入方式常用功能map[] 的灵活使用 set 什么是set set是STL中一个底层为二叉搜索树来实现的容器 若要使用set需要包含头文件 #include<set>set中的元素具有唯一性(因此可以用set去重)若用…...
990-28产品经理:Different types of IT risk 不同类型的IT风险
Your IT systems and the information that you hold on them face a wide range of risks. If your business relies on technology for key operations and activities, you need to be aware of the range and nature of those threats. 您的IT系统和您在其中持有的信息面临…...
wpa_supplicant与用户态程序的交互分析
1 wpa_supplicant与用户态程序wpa_cli的交互过程 1.1 交互接口类型 wpa_supplicant与用户态程序交互的主要接口包括以下几种: 1)命令行界面:通过命令行工具 wpa_cli 可以与 wpa_supplicant 进行交互。wpa_cli 允许用户执行各种 wpa_suppli…...
JavaScript继承 寄生组合式继承 extends
JavaScript继承 1、JS 的继承到底有多少种实现方式呢? 2、ES6 的 extends 关键字是用哪种继承方式实现的呢? 继承种类 原型链继承 function Parent1() {this.name parentlthis.play [1, 2, 3] }function Child1() {this.type child2 }Child1.prototype new Parent1(…...
Nginx 和Tomcat比较
Nginx和Tomcat是两种不同的技术,它们在应用场景、性能、动态处理能力等方面有所区别: 应用场景 Nginx通常用作静态内容服务器或代理服务器,可以将外部请求转发给其他应用服务器,如Tomcat、Django等。而Tomcat则主要用作应用服…...
p18 线性代数,行阶梯型矩阵
行阶梯型矩阵 行最简型矩阵...
leetcode—— 动态规划—— 零钱兑换
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无限的。 示…...
DeepSeek OCR:文档智能处理的成本革命与工程落地
1. 这不是又一个OCR工具,而是一次成本结构的重写DeepSeek OCR这个名字刚出来时,我第一反应是:又一个堆参数的模型?点开官网文档扫了一眼,发现它连“支持PDF”这种基础描述都懒得写——因为PDF只是输入格式里最不值一提…...
2026年南京Geo公司将有何新动态?一起探寻其发展新方向!
在数字化浪潮汹涌澎湃的当下,AI智能营销领域正经历着前所未有的变革。顺炫科技作为该领域的深耕者,一直致力于为全球客户提供高效、智能的数字化推广解决方案。随着2026年的到来,顺炫科技又将有哪些新动态,其发展新方向又将指向何…...
90%的小程序死于“搜不到”:微信搜索排名优化全拆解
在微信生态里,小程序早已不是“有没有”的问题,而是“能不能被找到”的问题。用户搜索关键词时,你的小程序排在第几位,直接决定了流量的天花板。很多人以为排名靠运气,其实背后有一套可复制的优化逻辑。一、名称是最大…...
VMware虚拟机创建详细教程(新手小白友好)
本教程以 VMware Workstation Pro 16/17 版本为例,演示如何创建一台新的虚拟机。第一步:启动新建虚拟机向导打开VMware Workstation,点击主界面上的 “创建新的虚拟机”,或依次点击菜单栏“文件” → “新建虚拟机”。图1 VMware创…...
【独家实测】ChatGPT-4 Turbo vs GPT-3.5 Turbo单位token成本对比:附Python自动核算脚本(限免24h)
更多请点击: https://codechina.net 第一章:ChatGPT API价格计算的底层逻辑与成本认知 ChatGPT API 的计费并非基于会话时长或请求次数,而是严格依据模型实际处理的 token 数量——包括输入(prompt)和输出(…...
DeepSeek LeetCode 2561. 重排水果 Java实现
LeetCode 2561. 重排水果题目分析有两个长度为 n 的数组 basket1 和 basket2,每个数组包含若干水果。每次操作可以交换两个数组中的任意水果,花费为这两个水果中较小的那个值。目标是使两个数组中的水果种类和数量完全相同(即两个数组重排后相…...
【Typescript】11-类抽象类与面向对象建模
类、抽象类与面向对象建模 TypeScript 不是一门纯粹的面向对象语言,但它对类系统的支持足够完整,足以覆盖很多工程场景。问题在于,很多人学到 class 之后,会误以为这就是组织 TypeScript 代码的默认方式。现实恰恰相反࿱…...
Salesforce 扩展“无头”概念至企业数据管理,新架构与系统二季度末或年底推出
分析师提醒分析师表示,此次更新或许能让开发者省去构建 AI 驱动工作流时通常所需的大量集成和定制开发工作,但首席信息官(CIO)们应警惕成本和准确性方面的问题。“无头”概念扩展Salesforce 似乎正致力于“颠覆”企业软件领域。在…...
智能戒指制造商Oura秘密提交IPO申请,累计融资15亿美元,付费会员有望破500万
5月22日消息,据《华尔街日报》报道,智能戒指制造商Oura已秘密提交首次公开募股(IPO)申请。该产品获多位名人称赞,销量可观,此次IPO表现值得关注。产品功能与背景Oura智能戒指能追踪心率、皮肤温度等指标&am…...
保姆级教程:在Ubuntu 22.04上从源码编译RISC-V SPIKE模拟器(含libboost报错解决)
从零构建RISC-V开发环境:Ubuntu 22.04下SPIKE模拟器深度编译指南 当第一次接触RISC-V生态时,搭建可靠的开发环境往往成为新手面临的第一个挑战。作为RISC-V官方推荐的指令集模拟器,SPIKE以其轻量级和准确性成为学习RISC-V架构的理想工具。本文…...
