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 -> NULL
    ListNode* 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):将有序的子数组合并成更大的有序数组。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VLAN单臂路由

1、搭建网络 搭建拓扑、规划IP、划分网段 2、交换机配置 配置脚本&#xff08;设置trunk和创建vlan很重要&#xff09; Switch>enable Switch#conf t Enter configuration commands, one per line. End with CNTL/Z.//创建vlan20 Switch(config)#vlan 20 Switch(config…

Android 添加自己的时钟小部件

小部件&#xff0c;也叫微件&#xff0c; 它的介绍参考官网 应用 widget 概览 https://developer.android.google.cn/develop/ui/views/appwidgets/overview?hlzh-cn 直接上图&#xff0c;原生系统上&#xff0c;时钟应用的小部件效果。 我也整一个。 1.创建小部件布局文…

陈好与王星越中戏传承

陈好与王星越&#xff1a;中戏传承&#xff0c;万人迷与未来之星在娱乐圈的星光璀璨中&#xff0c;我们时常被那些耀眼的明星所吸引&#xff0c;但你是否曾想过&#xff0c;他们背后的成长之路&#xff0c;是如何被一位位优秀的老师所指引的呢&#xff1f;今天&#xff0c;就让…

香橙派 5 PLUS 安装QQ(arm架构、Ubuntu系统)

1、下载QQ for Linux&#xff1a; 访问腾讯QQ官网&#xff0c;下载适用于香橙派 5 PLUS的arm架构Linux的QQ安装包。 比如&#xff1a;ARM版下载deb格式QQ安装包 ‘ QQ_3.2.9_240617_arm64_01.deb ’。 2、安装QQ for Linux&#xff1a; sudo dpkg -i [下载的文件名.deb]3、运…

【开源节流】如何通过数字化转型增强盈利能力?

引言&#xff1a;随着市场竞争的日益激烈&#xff0c;新技术发展的推动和企业发展的需求等&#xff0c;这些背景因素共同促使企业加快数字化转型步伐&#xff0c;以适应市场变化、提升竞争力并实现可持续发展。那如何通过如何通过数字化转型增强盈利能力&#xff1f;需要通过开…

食品企业仓储式批发零售一体化解决方案

食品企业需要有效应对日益复杂的市场挑战和消费者需求的快速变化的挑战并提升市场竞争力&#xff0c;仓储式类的批发零售一体化需求应运而生。这一全新的商业模式不仅整合了传统的批发和零售模式&#xff0c;还优化了供应链管理和客户体验&#xff0c;成为食品行业发展的新引擎…

如何监控巨量千川的违规行为

在这个瞬息万变的数字营销时代&#xff0c;每一分数据都蕴含着无限价值&#xff0c;尤其在电商领域&#xff0c;精准洞察与高效决策力已成为致胜关键。然而&#xff0c;面对巨量千川这一电商一体化智能营销平台的广阔天地&#xff0c;如何在海量信息中准确捕捉投放违规信息&…

51单片机STC89C52RC——6.2 定时器

一&#xff0c;定时器介绍 STC89C51RC/RD系列单片机的定时器0和定时器1&#xff0c;与传统8051的定时器完全兼容&#xff0c;当在定时器1做波特率发生器时&#xff0c;定时器0可以当两个8位定时器用。 STC89C51RC/RD系列单片机内部设置的两个16位定时器/计数器TO和T1都…

mac电脑守护神CleanMyMac2024免费版本下载

&#x1f31f; 电脑的守护神&#xff1a;CleanMyMac&#x1f47e; 亲爱的数码控们&#xff0c;是不是每次看到电脑上满满的垃圾文件和缓慢的运行速度就感到头疼呢&#xff1f;别怕&#xff0c;今天我要来给你们安利一款神奇的小帮手——CleanMyMac&#xff01;它可是我们电脑的…

gbase8s关于客户端和数据库连接的方式和应用建立连接的简单线索分工

应用和数据库的连接分为本地连接和远程连接&#xff0c;当应用程序和数据库在同一台服务器上为本地连接&#xff0c;不在一台服务器上为远程连接 1. 本地连接 本地连接三种方式&#xff1a; 通过共享内存消息系统&#xff1a;应用和数据库在同一台服务器上&#xff0c;应用程…

01_01_Mybatis的介绍与快速入门

一、数据持久层框架的发展历程 1、JDBC JDBC&#xff08;Java Data Base Connection&#xff09;&#xff0c;是一种用于执行SQL语句的Java API&#xff0c;为多种关系型数据库提供了统一访问的方式&#xff0c;它由一组用Java语言编写的类和接口组成。JDBC提供了一种规范&…

前端路线指导(4):前端春招秋招经验分享

春招/秋招经验分享(前端) 哈喽大家好&#xff0c;我是小粉&#xff0c;双一流本科&#xff0c;自学前端一年&#xff0c;收获腾讯&#xff0c;字节等多家大厂offer&#xff0c;一半以上ssp~ 今天给大家分享一下我的春招&#xff08;暑期实习&#xff09;、秋招经历&#xff0c;…

“论多源数据集成及应用”必过范文,软考高级,系统架构设计师论文

论文真题 在如今信息爆炸的时代,企业、组织和个人面临着大量的数据。这些数据来自不同的渠道和资源,包括传感器、社交媒体、销售记录等,它们各自具有不同的数据格式、分布和存储方式。因此如何收集、整理和清洗数据,以建立一个一致、完整的数据集尤为重要。多源数据集成可…

云邮件推送服务如何配置?有哪些优势特点?

云邮件推送的性能怎么优化&#xff1f;如何选择邮件推送服务&#xff1f; 云邮件推送服务是一种基于云计算的邮件发送解决方案&#xff0c;能够帮助企业和个人高效地发送大规模邮件。AokSend将详细介绍如何配置云邮件推送服务&#xff0c;以便你能够充分利用其优势。 云邮件推…

航行在水域:使用数据湖构建生产级 RAG 应用程序

在 2024 年年中&#xff0c;创建一个令人印象深刻和兴奋的 AI 演示可能很容易。需要一个强大的开发人员&#xff0c;一些聪明的提示实验&#xff0c;以及一些对强大基础模型的API调用&#xff0c;你通常可以在一个下午建立一个定制的AI机器人。添加一个像 langchain 或 llamain…

【会议征稿,JPCS出版】第三届电力系统与能源技术国际学术会议(ICPSET 2024,7月5-7)

第三届电力系统与能源技术国际学术会议&#xff08;ICPSET 2024&#xff09;将于2024年7月5-7日在杭州举办。由浙江水利水电学院电机产业学院主办&#xff0c;AEIC学术交流中心承办&#xff0c;湖州市南浔创新研究院、南浔区科技局&#xff08;科协&#xff09;协办 。会议主要…

云安全下的等级保护2.0解决方案

云安全解决方案 知识星球&#x1f517;除了包含技术干货&#xff1a;Java代码审计、web安全、应急响应等&#xff0c;还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 ​

操作系统实验二:存储管理(分析XV6分页存储地址变换)

目录 一、实验目的 二、具体任务安排 1.理解XV6内核源码 2.修改XV6内核源码 一、实验目的 分析XV6教学系统分页存储地址变换的实现 二、具体任务安排 1.理解XV6内核源码 &#xff08;1&#xff09;阅读学习通资料中的XV6 guide book第一、第二章或自行查阅相关资料&a…

基于51单片机计步器—无线蓝牙APP上传

基于51单片机计步器设计 &#xff08;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 本设计由STC89C52单片机最小系统ADXL345加速度传感器lcd1602液晶电路蓝牙模块电路呼吸灯电路电源电路组成。 1.通过ADXL345检测步数&#xff0…

嵌入式web 服务器boa的编译和移植

编译环境&#xff1a;虚拟机 ubuntu 18.04 目标开发板&#xff1a;飞凌OKA40i-C开发板&#xff0c; Linux3.10 操作系统 开发板本身已经移植了boa服务器&#xff0c;但是在使用过程中发现POST方法传输大文件时对数据量有限制&#xff0c;超过1M字节就无法传输&#xff0c;这是…