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

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)算法。下面是整体的思路:

  1. 归并排序的核心思想:归并排序是一种分治算法,首先将待排序的链表分成两部分,然后分别对这两部分进行排序,最后将排好序的两部分链表合并起来。

  2. mergeSort 函数:这个函数是归并排序的入口,负责调用递归排序的函数 mergeSort,并返回排好序的链表。在 mergeSort 中,首先判断链表是否为空或只有一个节点,如果是,则直接返回原链表。然后找到链表的中间节点 mid,将链表分成左右两部分,分别以 head 和 mid->next 开始。然后分别对左右两部分链表调用 mergeSort 递归排序,最终通过 merge 函数将排好序的两部分链表合并。

  3. findMid 函数:这个函数用快慢指针的方法找到链表的中间节点,快指针每次移动两步,慢指针每次移动一步,当快指针到达链表末尾时,慢指针指向的节点即为中间节点。

  4. 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 &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5] 输入&#xff1a;head [] 输出&#xff1a;[] 思路…...

qt学习:网络调试助手客户端+服务端

目录 客户端 步骤 ui界面配置​编辑 添加头函数&#xff0c;类成员数据&#xff0c;类成员函数 添加模块 构造函数 连接按钮 收到来自服务器的数据触发 发送按钮 断开按钮 向textEditRev文本编辑器中插入指定颜色的文本 服务端 步骤 ui界面配置 添加头函数&…...

C语言拾遗

函数的地址传递&#xff1a; 函数体内部想要修改函数体外部变量值的时候&#xff0c;使用地址传递 int set(int *pa) {//功能 } int main(void) {int a0;set(&a);//此时a的值经过set函数的修改&#xff0c;且传递到了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、将容器的根文件系统挂载为只读 修复建议&#xff1a; 添加“ --read-only”标志&#xff0c;以允许将容器的根文件系统挂载为只读。 可以将其与卷结合使用&#xff0c;以强制容器的过程仅写入要保留的位置。 可以使用命令&#x…...

ZooKeeper概述

ZooKeeper是一个开源的分布式协调服务&#xff0c;由Apache Software Foundation维护。它主要用于解决分布式应用中遇到的一些最常见问题&#xff0c;如命名服务、状态同步、配置管理和群集管理等。通过提供一套简单但强大的API&#xff0c;ZooKeeper使得从简单的锁服务到复杂的…...

【sgCollapseBtn】自定义组件:底部折叠/展开按钮

特性&#xff1a; 支持自定义折叠状态支持自定义标签名称 sgCollapseBtn源码 <template><div :class"$options.name" click"show !show" :placement"placement"><div class"collapse-btns"><div class"c…...

如何根据玩家数量和游戏需求选择最合适的服务器配置?

根据玩家数量和游戏需求选择最合适的服务器配置&#xff0c;首先需要考虑游戏的类型、玩家数量、预计的在线时间以及对内存和CPU性能的需求综合考虑。对于大型多人在线游戏&#xff0c;如MMORPG或MOBA等&#xff0c;由于需要更多的CPU核心数来支持更复杂的游戏逻辑和处理大量数…...

问题解决:各版本的vc_redist下载地址 缺少msvcr100.dll、msvcr120.dll、msvcr140.dll

Visual C Redistributable for Visual Studio各版本的官方链接。解决缺少msvcr100.dll、msvcr120.dll、msvcr140.dll的问题。 下面全部为官方链接&#xff1a; Microsoft Visual C Redistributable 2019 x86: https://aka.ms/vs/16/release/VC_redist.x86.exe x64: https://ak…...

182基于matlab的半监督极限学习机进行聚类

基于matlab的半监督极限学习机进行聚类&#xff0c;基于流形正则化将 ELM 扩展用于半监督&#xff0c;三聚类结果可视化输出。程序已调通&#xff0c;可直接运行。 182matlab ELM 半监督学习 聚类 模式识别 (xiaohongshu.com)...

C语言数组案例编程

1. 编写一个程序实现&#xff1a;从键盘输入15个整数存入数组&#xff0c;然后统计其中正整数的个数。 【要求】采用函数编程 #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) 短语结构&#xff08;Constituency&#xff09;&#xff1a;短语结构语法是一种描述语言结构的方法&#xff0c;它将句子划…...

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与用户态程序交互的主要接口包括以下几种&#xff1a; 1&#xff09;命令行界面&#xff1a;通过命令行工具 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是两种不同的技术&#xff0c;它们在应用场景、性能、动态处理能力等方面有所区别&#xff1a; 应用场景 Nginx通常用作静态内容服务器或代理服务器&#xff0c;可以将外部请求转发给其他应用服务器&#xff0c;如Tomcat、Django等。而Tomcat则主要用作应用服…...

p18 线性代数,行阶梯型矩阵

行阶梯型矩阵 行最简型矩阵...

leetcode—— 动态规划—— 零钱兑换

给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无限的。 示…...

DeepSeek OCR:文档智能处理的成本革命与工程落地

1. 这不是又一个OCR工具&#xff0c;而是一次成本结构的重写DeepSeek OCR这个名字刚出来时&#xff0c;我第一反应是&#xff1a;又一个堆参数的模型&#xff1f;点开官网文档扫了一眼&#xff0c;发现它连“支持PDF”这种基础描述都懒得写——因为PDF只是输入格式里最不值一提…...

2026年南京Geo公司将有何新动态?一起探寻其发展新方向!

在数字化浪潮汹涌澎湃的当下&#xff0c;AI智能营销领域正经历着前所未有的变革。顺炫科技作为该领域的深耕者&#xff0c;一直致力于为全球客户提供高效、智能的数字化推广解决方案。随着2026年的到来&#xff0c;顺炫科技又将有哪些新动态&#xff0c;其发展新方向又将指向何…...

90%的小程序死于“搜不到”:微信搜索排名优化全拆解

在微信生态里&#xff0c;小程序早已不是“有没有”的问题&#xff0c;而是“能不能被找到”的问题。用户搜索关键词时&#xff0c;你的小程序排在第几位&#xff0c;直接决定了流量的天花板。很多人以为排名靠运气&#xff0c;其实背后有一套可复制的优化逻辑。一、名称是最大…...

VMware虚拟机创建详细教程(新手小白友好)

本教程以 VMware Workstation Pro 16/17 版本为例&#xff0c;演示如何创建一台新的虚拟机。第一步&#xff1a;启动新建虚拟机向导打开VMware Workstation&#xff0c;点击主界面上的 “创建新的虚拟机”&#xff0c;或依次点击菜单栏“文件” → “新建虚拟机”。图1 VMware创…...

【独家实测】ChatGPT-4 Turbo vs GPT-3.5 Turbo单位token成本对比:附Python自动核算脚本(限免24h)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;ChatGPT API价格计算的底层逻辑与成本认知 ChatGPT API 的计费并非基于会话时长或请求次数&#xff0c;而是严格依据模型实际处理的 token 数量——包括输入&#xff08;prompt&#xff09;和输出&#xff08…...

DeepSeek LeetCode 2561. 重排水果 Java实现

LeetCode 2561. 重排水果题目分析有两个长度为 n 的数组 basket1 和 basket2&#xff0c;每个数组包含若干水果。每次操作可以交换两个数组中的任意水果&#xff0c;花费为这两个水果中较小的那个值。目标是使两个数组中的水果种类和数量完全相同&#xff08;即两个数组重排后相…...

【Typescript】11-类抽象类与面向对象建模

类、抽象类与面向对象建模 TypeScript 不是一门纯粹的面向对象语言&#xff0c;但它对类系统的支持足够完整&#xff0c;足以覆盖很多工程场景。问题在于&#xff0c;很多人学到 class 之后&#xff0c;会误以为这就是组织 TypeScript 代码的默认方式。现实恰恰相反&#xff1…...

Salesforce 扩展“无头”概念至企业数据管理,新架构与系统二季度末或年底推出

分析师提醒分析师表示&#xff0c;此次更新或许能让开发者省去构建 AI 驱动工作流时通常所需的大量集成和定制开发工作&#xff0c;但首席信息官&#xff08;CIO&#xff09;们应警惕成本和准确性方面的问题。“无头”概念扩展Salesforce 似乎正致力于“颠覆”企业软件领域。在…...

智能戒指制造商Oura秘密提交IPO申请,累计融资15亿美元,付费会员有望破500万

5月22日消息&#xff0c;据《华尔街日报》报道&#xff0c;智能戒指制造商Oura已秘密提交首次公开募股&#xff08;IPO&#xff09;申请。该产品获多位名人称赞&#xff0c;销量可观&#xff0c;此次IPO表现值得关注。产品功能与背景Oura智能戒指能追踪心率、皮肤温度等指标&am…...

保姆级教程:在Ubuntu 22.04上从源码编译RISC-V SPIKE模拟器(含libboost报错解决)

从零构建RISC-V开发环境&#xff1a;Ubuntu 22.04下SPIKE模拟器深度编译指南 当第一次接触RISC-V生态时&#xff0c;搭建可靠的开发环境往往成为新手面临的第一个挑战。作为RISC-V官方推荐的指令集模拟器&#xff0c;SPIKE以其轻量级和准确性成为学习RISC-V架构的理想工具。本文…...