LeetCode 算法:排序链表 c++

原题链接🔗:排序链表
难度:中等⭐️⭐️

题目

给你链表的头结点 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. 题解

LeetCode 上的 “Sort a linked list” 题目要求我们对链表进行排序。这个问题可以通过多种排序算法来解决,但是使用归并排序是最有效的方法,因为链表不适合使用快速排序或堆排序这类需要随机访问数据的算法。以下是使用归并排序对链表进行排序的解题思路:

  • 选择排序算法:由于链表的特性,归并排序是一个很好的选择。归并排序在链表上的实现相对简单,因为它不需要随机访问元素,只需要遍历链表。

  • 归并排序链表的步骤: 归并排序链表的步骤如下:

    • 分割链表:找到链表的中点,将链表分为两个子链表。
    • 递归排序:对两个子链表递归地进行排序。
    • 合并链表:合并两个已排序的子链表。
  • 实现分割链表:使用快慢指针法来找到链表的中点:

    • 初始化两个指针 slow 和 fast,都指向头节点。
    • fast 每次移动两步,slow 每次移动一步。
    • 当 fast到达链表末尾时,slow 将位于中点。
  • 实现递归排序 :递归地对分割后的两个子链表进行排序:

    • 如果子链表为空或只有一个节点,直接返回该子链表。
    • 否则,分割子链表并递归排序。
  • 实现合并链表:合并两个有序链表:

    • 创建一个哑节点(dummy node),用于简化边界条件的处理。
    • 使用一个指针 tail 指向哑节点,用于构建合并后的链表。
    • 比较两个链表头部的节点值,将较小的节点添加到合并后的链表中,并将对应的指针向前移动。
    • 重复上述步骤,直到两个链表中的一个为空。
    • 将非空链表的剩余部分直接连接到合并后的链表。
  1. 复杂度:时间复杂度O(nlogn),其中n是链表的长度;空间复杂度O(1)。
  2. c++ demo
#include <iostream>// 定义链表节点
struct ListNode {int val;ListNode* next;ListNode(int x) : val(x), next(NULL) {}
};class Solution {
public:ListNode* sortList(ListNode* head) {if (!head || !head->next) return head;// 找到链表的中点,准备分割链表ListNode* slow = head, * fast = head;while (fast->next && fast->next->next) {slow = slow->next;fast = fast->next->next;}// 切割链表ListNode* second = slow->next;slow->next = NULL;// 递归排序链表的两半ListNode* left = sortList(head);ListNode* right = sortList(second);// 合并排序后的链表return merge(left, right);}private:ListNode* merge(ListNode* l1, ListNode* l2) {// 合并两个有序链表ListNode dummy(0);ListNode* tail = &dummy;while (l1 && l2) {if (l1->val < l2->val) {tail->next = l1;l1 = l1->next;}else {tail->next = l2;l2 = l2->next;}tail = tail->next;}// 连接剩余部分tail->next = l1 ? l1 : l2;return dummy.next;}
};int main() {Solution solution;// 创建示例链表 4 -> 1 -> 3 -> 2 -> NULLListNode* head = new ListNode(4);head->next = new ListNode(1);head->next->next = new ListNode(3);head->next->next->next = new ListNode(2);// 排序链表ListNode* sortedHead = solution.sortList(head);// 打印排序后的链表for (ListNode* node = sortedHead; node; node = node->next) {std::cout << node->val << " -> ";}std::cout << "NULL" << std::endl;// 释放链表内存while (sortedHead) {ListNode* temp = sortedHead;sortedHead = sortedHead->next;delete temp;}return 0;
}
  • 输出结果:

1 -> 2 -> 3 -> 4 -> NULL
在这里插入图片描述

归并排序

归并排序(Merge Sort)是一种分治算法,用于对数组或列表进行排序。它基于以下两个原则:

  • 分解(Divide):将数组分成两半,直到每个子数组只有一个元素。
  • 合并(Conquer):将有序的子数组合并成更大的有序数组。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/32205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客练习题打卡--redis

A list保证数据线性有序且元素可重复&#xff0c;它支持lpush、blpush、rpop、brpop等操作&#xff0c;可以当作简单的消息队列使用&#xff0c;一个list最多可以存储2^32-1个元素; redis中set是无序且不重复的; zset可以按照分数进行排序 &#xff0c;是有序不重复的; Redi…

Arduino入门4——基于millis函数、定时器中断的多任务框架

Arduino入门4——基于millis函数、定时器中断的多任务框架 millis函数定时器中断总结&#xff08;笔者的碎碎念。。。。。。。。&#xff09; 上一期我们基于oled学习了库的调用&#xff0c;这一期我们基于millis函数和定时器中断&#xff0c;学习以下多任务框架。但是我们本期…

CentOS9镜像下载地址加速下载

CentOS 9 是 CentOS 项目的最新版本之一&#xff0c;它基于 RHEL&#xff08;Red Hat Enterprise Linux&#xff09;9 的源代码构建。CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个免费的企业级 Linux 发行版&#xff0c;旨在提供一个与 RHEL 兼…

大模型项目落地时,该如何估算模型所需GPU算力资源

近期公司有大模型项目落地。在前期沟通时,对于算力估算和采购方案许多小伙伴不太了解,在此对相关的算力估算和选择进行一些总结。 不喜欢过程的可以直接 跳到HF上提供的模型计算器 要估算大模型的所需的显卡算力,首先要了解大模型的参数基础知识。 大模型的规模、参数的理解…

路由器基础配置以及静态路由配置

1、搭建网络 搭建网络拓扑、分配IP地址、划分网段、连接端口 2、配置路由器 路由器基础配置 //进入全局配置模式 Router#enable Router#conf t Enter configuration commands, one per line. End with CNTL/Z.//配置高速同步串口serial2/0 Router(config)#int ser2/0 Route…

21.智能指针(上)

目录 一、概念二、Box\<T\>2.1 概念与应用场景2.2 简单应用2.3 递归类型的创建 三、通过Deref trait将智能指针当作常规引用处理3.1 常规引用3.2 像引用一样使用Box\<T\>3.3 自定义智能指针3.4 函数和方法的隐式解引用强制转换3.5 解引用强制转换与可变性交互 四、…

docker简单快速使用上手

1.Docker是什么&#xff1f; Docker 是一个开源的容器化平台&#xff0c;主要用于开发、运输和运行应用程序。它通过提供轻量级的虚拟化机制&#xff0c;使得开发者可以在一个隔离的环境中运行和管理应用程序及其依赖项。Docker 的核心组件包括镜像&#xff08;Image&#xff…

Python | Leetcode Python题解之第165题比较版本号

题目&#xff1a; 题解&#xff1a; class Solution:def compareVersion(self, version1: str, version2: str) -> int:n, m len(version1), len(version2)i, j 0, 0while i < n or j < m:x 0while i < n and version1[i] ! .:x x * 10 ord(version1[i]) - o…

18.cobra框架了解

目录 概述举例安装实践实践 概述 github cobra cobra 快速的实现一个命令行客户端&#xff0c;命令行解析工具。 cobra 中的主要概念 -Commands 表示执行运作-Args 执行参数-Flags 这些运作的标识符 举例 git clone 命令 git clone https://github.com/spf13/cobra.git -…

【Java】已解决java.nio.channels.OverlappingFileLockException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.nio.channels.OverlappingFileLockException异常 在Java的NIO&#xff08;New I/O&#xff09;编程中&#xff0c;java.nio.channels.OverlappingFileLockException是一…

ArrayList知识点(面试)

上一篇我们说了hashmap的相关知识点&#xff0c;这一篇我们再说一些ArrayList的相关知识&#xff0c;因为ArrayList也是我们项目中比较常用的。 ArrayList(底层是数组) 底层工作原理 首先&#xff0c;在构造ArrayList的时候会先看有没有指定容量&#xff0c;如果没有&#xf…

人人讲视频如何下载

一、工具准备 1.VLC media player 2.谷歌浏览器 二、视频下载 1.打开人人讲网页&#xff0c;需要下载的视频 谷歌浏览器打开调试窗口 搜索m3u8链接 拷贝到VLCplayer打开网络串流方式打开测试是否能正常播放 2.下载视频 能正常播放后&#xff0c;切换播放为转换选择mp4格式…

24年火爆全网的企业信贷产品-民生惠详解

今年&#xff0c;民生惠企业信贷产品非常火爆&#xff01;客户想申请这信用贷款前&#xff0c;先确认下自己是不是在白名单里。有些地区还能加进白名单&#xff0c;不在的话就别申请了&#xff0c;这是专门给受邀的小微企业的。 这款产品的细节是这样的&#xff1a; 额度&am…

visual studio 创建c++项目

目录 环境准备&#xff1a;安装 visual studiovisual studio 创建c项目Tips&#xff1a;新建cpp文件注释与取消注释代码 其他初学者使用Visual Studio开发C和C时常遇到的3个坑 环境准备&#xff1a;安装 visual studio 官网&#xff1a;https://visualstudio.microsoft.com/zh…

【十三】图解mybatis缓存模块之装饰器模式

图解mybatis缓存模块之装饰器模式 简介 之前有写过一篇博客介绍过mybatis的缓存模块设计【九】mybatis 缓存模块设计-CSDN博客 &#xff0c;当时着重讲解的是mybatis种一级缓存和二级缓存&#xff0c;本次博客补充讲解一下装饰器模式的应用&#xff0c;本篇主要分两部分讲解&a…

kotlin智能类型转换

1、在kotlin这中&#xff0c;定义如下类型&#xff0c;在判断不为null的语句里边&#xff0c;会发生类型转换&#xff1a; fun main(){var a:String? "XXX" // a 类型为 String? 可能为 null// 在if 语句中&#xff0c;a 的类型为 Stringif(a ! null){println(a.l…

动态ARP

定义 动态ARP表项由ARP协议通过ARP报文自动生成和维护&#xff0c;可以被老化&#xff0c;可以被新的ARP报文更新&#xff0c;可以被静态ARP表项覆盖。 动态ARP适用于拓扑结构复杂、通信实时性要求高的网络。 ARP地址解析过程 动态ARP通过广播ARP请求和单播ARP应答这两个过…

使用 Kubernetes 部署 MinIO 和 Trino

Trino&#xff08;以前称为 Presto&#xff09;是一个 SQL 查询引擎&#xff0c;而不是 SQL 数据库。Trino 避开了 SQL 数据库的存储组件&#xff0c;只专注于一件事 - 超快的 SQL 查询。Trino 只是一个查询引擎&#xff0c;不存储数据。相反&#xff0c;Trino与各种数据库交互…

GWO-CNN-SVM,基于GWO灰狼优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类)

GWO-CNN-SVM&#xff0c;基于GWO灰狼优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类) 1. GWO灰狼优化算法 灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;是一种启发式优化算法&#xff0c;模拟了灰狼群体的社会行为&#xff0c;包…

天马学航——智慧教务系统(移动端)开发日志六

天马学航——智慧教务系统(移动端)开发日志六 日志摘要&#xff1a;统一身份认证设计&#xff0c;修复了选课信息错乱的问题 界面设计 实现思路 使用 Java 和 Jedis 完成实现&#xff1a; 步骤一&#xff1a;添加 Jedis 依赖 首先需要在项目中添加 Jedis 依赖&#xff0c;…