刷题 - 分治

news2024/10/10 11:47:58

面试经典 150 题 - 分治

148. 排序链表⭐️⭐️⭐️ - 快慢指针找中间节点 - 归并排序

在这里插入图片描述
伪代码:

  • 将链表拆分成两半,返回右半边头节点(左半边头节点就是原始链表头节点)
  • 对左边进行排序并返回左边头节点
  • 对右边进行排序返回右边头节点
  • 传入左右半边头节点,合并两个升序链表
// bug1: 把 cur_a->val <= cur_b->val 写成 cur_a <= cur_b
// 优化1:使用快慢指针找到中间节点,而不是两次遍历

//  分治的思想: 链表排序 = 断开左右半部分连接,对左半部分进行排序 + 对右半部分进行排序 + 合并两个升序链表
//  返回 升序链表的头节点
class Solution {
public:
    // 返回中间节点并拆分链表
    ListNode* splitList(ListNode* head) {
        if (head == nullptr || head->next == nullptr) return nullptr;
        ListNode* slow = head;
        ListNode* fast = head;
        ListNode* prev = nullptr;
        while (fast && fast->next) {
            prev = slow;
            slow = slow->next;
            fast = fast->next->next;
        }
        if (prev) prev->next = nullptr; // 拆分链表
        return slow;
    }
    // 合并两个升序链表 (不使用 dummy_head)
    ListNode* mergeList(ListNode* head_a, ListNode* head_b) {
        if (!head_a) return head_b;
        if (!head_b) return head_a;
        ListNode* merged_head = nullptr;  // 合并后链表的头节点
        ListNode* cur = nullptr;          // 当前操作的节点
        // 初始化 merged_head 和 cur
        if (head_a->val <= head_b->val) {
            merged_head = head_a;
            head_a = head_a->next;
        } else {
            merged_head = head_b;
            head_b = head_b->next;
        }
        cur = merged_head;
        // 合并剩余节点
        while (head_a && head_b) {
            if (head_a->val <= head_b->val) {
                cur->next = head_a;
                head_a = head_a->next;
            } else {
                cur->next = head_b;
                head_b = head_b->next;
            }
            cur = cur->next;
        }
        cur->next = (head_a != nullptr) ? head_a : head_b; 
        return merged_head;
    }

    // 归并排序
    ListNode* sortList(ListNode* head) {
        if (head == nullptr || head->next == nullptr) return head;
        // 拆分链表
        ListNode* mid = splitList(head);
        // 递归排序前半部分和后半部分
        ListNode* left = sortList(head);
        ListNode* right = sortList(mid);
        // 合并排序后的两个链表
        return mergeList(left, right);
    }
};

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

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

相关文章

图片压缩怎么弄?压缩图片大小的多种方法介绍

图片压缩怎么弄&#xff1f;图片压缩技术正是为了解决这些问题而生。通过有效减少文件大小&#xff0c;我们可以在保持视觉质量的前提下&#xff0c;更加高效地管理和分享图片。这项技术不仅能帮助个人用户优化手机或电脑的存储&#xff0c;还对企业在处理大量图像资产时显得尤…

小米路由器R3Gv2安装openwrt记录

前言 小米路由器R3Gv2的硬件配置与小米路由器4A千兆版一致&#xff0c;但bootloader有所不同&#xff0c;因此openwrt的固件不要互刷。另外&#xff0c;R3Gv2和R3G、4A百兆版是不同的设备&#xff0c;切勿混淆。 硬件信息 OpenWrt参数页-Xiaomi MiWiFi 3G v2 CPU&#xff1a…

Springboot网上书城小程序—计算机毕业设计源码38707

目 录 摘要 1 绪论 1.1 研究背景及意义 1.2国内外研究现状 1.3系统开发的内容 1.4论文结构与章节安排 1.5小程序框架以及目录结构介绍 2 网上书城小程序系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统功能分析…

Unity实现自定义图集(三)

以下内容是根据Unity 2020.1.0f1版本进行编写的   1、实现编辑器模式下进游戏前Pack全部自定义图集 同Unity的图集一样,Unity的编辑器模式会在进游戏前把全部的SpriteAtlas都打一次图集,如图: 我们也实现这样的效果。 首先需要获取全部的图集路径。因为目前使用的是以.…

chaos官方给的V-Ray材质优化器怎么样?

V-Ray材质优化器是一个为3ds Max设计的MAX脚本&#xff0c;它通过以下方式优化场景&#xff0c;提高渲染速度&#xff01; V-Ray材质优化器安装包可找【成都渲染101云渲染&#xff0c;云渲码6666】提供&#xff01; ​ 通过创建一个新的UV通道并使用平面映射算法展开场景对象。…

【学术会议征稿】第五届应用力学与机械工程国际学术会议(ICAMME 2024)

第五届应用力学与机械工程国际学术会议&#xff08;ICAMME 2024&#xff09; 2024 5th International Conference on Applied Mechanics and Mechanical Engineering 在全球技术快速发展的背景下&#xff0c;应用力学和机械工程作为推动现代工业创新的根基&#xff0c;持续展…

【新品发布】数字能源EMS管理再掀新篇章

致远电子EM系列工商业储能网关累计装机容量突破2GWh&#xff01;聚焦数字综合能源应用&#xff0c;全新一代EM-800/EM-1000G发布&#xff0c;见证光储充时代的来临&#xff01; 早在2008年&#xff0c;致远电子的工程师在为国内某新能源企业设计光伏通讯管理机方案时&#xff0…

使用宝塔快速搭建配置Openai api接口代理+502 Bad Gateway网关错误问题解决

本教程提供了一种简便快捷的方法&#xff0c;无需复杂步骤&#xff0c;极易操作&#xff0c;实现零代码、零部署的快速接入。 实现准备 1.服务器&#xff0c;这里使用阿里香港轻量服务器&#xff09; 2. OpenAI官方的模型api key 3. 使用第三方系统或插件进行测试 关于第三方…

windows 安装 ElasticSearch

1、下载安装包 下载地址&#xff1a; ElasticSearch 目录结构如下&#xff1a; 2、配置JDK环境 3、配置ElasticSearch 的config 4、启动 ElasticSearch 服务 4.1、解决启动日志乱码问题 4.2、进入bin 目录&#xff0c;点击elasticsearch.bat 文件启动 ES 服务

大数据-162 Apache Kylin 全量增量Cube的构建 Segment 超详细记录 多图

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【无人水面艇路径跟随控制10】(Matlab)USV代码阅读:testUSV仿真无人水面艇在一定时间内的运动,使用欧拉法对状态进行积分,并绘制仿真结果

【无人水面艇路径跟随控制10】&#xff08;Matlab&#xff09;USV代码阅读&#xff1a;仿真无人水面艇在一定时间内的运动&#xff0c;使用欧拉法对状态进行积分&#xff0c;并绘制仿真结果 写在最前面testUSV.m总结代码详解1. **初始化部分**2. **仿真循环**3. **仿真数据提取…

【力扣刷题实战】(顺序表)移除元素

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 力扣题目&#xff1a; 移除元素 题目描述 示例 1&#xff1a; 示例 2&#xff1a; 解题思路 具体思路 题目要点 完整代码 兄弟们共勉 &#xff01;&#xff01;&#xff01; 每篇前言 博客主页&#xff1a;小卡…

AI测试入门:认识Graph RAG

AI测试入门&#xff1a;认识Graph RAG 前言1. 什么是Graph RAG&#xff1f;2. Graph RAG的工作原理3. Graph RAG的应用场景4. Graph RAG的技术实现5. Graph RAG的优势6. Graph RAG的实际应用案例总结 前言 传统的检索增强生成&#xff08;RAG&#xff09;方法逐渐暴露出一些局限…

高被引算法GOA优化VMD,结合Transformer-SVM的轴承诊断,保姆级教程!

本期采用2023年瞪羚优化算法优化VMD&#xff0c;并结合Transformer-SVM实现轴承诊断&#xff0c;算是一个小创新方法了。需要水论文的童鞋尽快&#xff01; 瞪羚优化算法之前推荐过&#xff0c;该成果于2023年发表在计算机领域三区SCI期刊“Neural Computing and Applications”…

DockerCompose 启动 open-match

背景介绍 open-match是Google和unity联合开源的支持实时多人匹配的框架&#xff0c;已有多家游戏厂商在生产环境使用&#xff0c;官网 https://open-match.dev/site/ 。原本我们使用的是UOS上提供的匹配能力&#xff0c;但是UOS目前不支持自建的Dedicated servers 集群&#x…

【万字长文】Word2Vec计算详解(一)CBOW模型

【万字长文】Word2Vec计算详解&#xff08;一&#xff09;CBOW模型 写在前面 本文用于记录本人学习NLP过程中&#xff0c;学习Word2Vec部分时的详细过程&#xff0c;本文与本人写的其他文章一样&#xff0c;旨在给出Word2Vec模型中的详细计算过程&#xff0c;包括每个模块的计…

LLM4Rec最新工作: 字节发布用于序列推荐的分层大模型HLLM

前几个月 Meta HSTU 点燃各大厂商对 LLM4Rec 的热情&#xff0c;一时间&#xff0c;探索推荐领域的 Scaling Law、实现推荐的 ChatGPT 时刻、取代传统推荐模型等一系列话题让人兴奋&#xff0c;然而理想有多丰满&#xff0c;现实就有多骨感&#xff0c;尚未有业界公开真正复刻 …

微服务架构---认识Zuul

目录 认识Zuul简单的例子 第一个Zuul程序步骤1&#xff1a;创建父工程zuul-1步骤2&#xff1a;创建HystrixController类步骤3&#xff1a;搭建服务消费者eureka-consumer项目&#xff08;1&#xff09;创建一个config包&#xff0c;在config包下新建配置类RestConfig&#xff0…

别再浪费时间!利用ChatGPT写作提效神器,赶紧收藏!

在信息化迅猛发展的当下&#xff0c;写作已成为我们日常中不可或缺的组成部分。论是在撰写报告、进行学术论文创作&#xff0c;还是写博客内容&#xff0c;写作都是我们思想和观点的核心手段。然而&#xff0c;写作非易事&#xff0c;它常需要我们付出大量的时间和精力。那么&a…