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

利用归并算法对链表进行排序

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode() : val(0), next(nullptr) {}
*     ListNode(int x) : val(x), next(nullptr) {}
*     ListNode(int x, ListNode *next) : val(x), next(next) {}
* };这里是链表的基本定义
*/
class Solution {
public:
ListNode* sortList(ListNode* head) {
if(head==nullptr||head->next==nullptr)return head;//对头指针进行判断
//利用快慢指针找到中间值mid
ListNode* slow=head;
ListNode* fast=head->next;
while(fast!=nullptr&&fast->next!=nullptr){
slow=slow->next;
fast=fast->next->next;
}
ListNode *mid=slow->next;
slow->next=nullptr;
//递归算法
ListNode* left=sortList(head);
ListNode* right=sortList(mid);
//将mid左右的链表进行合并
return merge(left,right);

    }
private:
ListNode* merge(ListNode* l1,ListNode* l2){
//创建一个哑节点
ListNode dummy(0);//注意:此时dummy用的是栈上对象而不是堆上对象(即用ListNode而不是ListNode* dummy = new ListNode(0);)
/*原因如下:
栈上对象特点:

            1.自动内存管理:函数结束时自动销毁,不需要手动释放

            2.高效:栈分配比堆分配快得多

            3.安全:不会内存泄漏
堆上对象特点:

1.需要手动管理内存:必须用 delete 释放,否则内存泄漏

            2.较慢:堆分配比栈分配慢

            3.容易出错:忘记释放会导致内存泄漏
*/
ListNode* tail=&dummy;//用tail接收
while(l1!=nullptr&&l2!=nullptr){
if(l1->val<l2->val){
tail->next=l1;
l1=l1->next;
}
else{
tail->next=l2;
l2=l2->next;
}
tail=tail->next;//尾指针后移
}
// 将剩余节点接到新链表尾部
tail->next=(l1!=nullptr)?l1:l2;//将剩余链表部分接上
return dummy.next;//返回头节点

    }
/*
递归过程:
sortList(4→2→1→3)

├─ 找到中点:slow在2,mid=1→3
├─ left = sortList(4→2) → 返回 2→4
│   │
│   ├─ sortList(4→2)
│   │   ├─ 找到中点:slow在4,mid=2
│   │   ├─ left = sortList(4) → 4
│   │   ├─ right = sortList(2) → 2
│   │   └─ merge(4,2) → 2→4
│   │
├─ right = sortList(1→3) → 返回 1→3
│   │
│   ├─ sortList(1→3)
│   │   ├─ 找到中点:slow在1,mid=3
│   │   ├─ left = sortList(1) → 1
│   │   ├─ right = sortList(3) → 3
│   │   └─ merge(1,3) → 1→3
│   │
└─ merge(2→4, 1→3) → 1→2→3→4
*/

};


文章转载自:

http://JYkC5PIo.gpwmj.cn
http://JWDWfCvp.gpwmj.cn
http://dRlGUS3V.gpwmj.cn
http://nFaP0O3H.gpwmj.cn
http://SkTIgH61.gpwmj.cn
http://ywTddQOP.gpwmj.cn
http://BG3W8OWg.gpwmj.cn
http://Mo4x1l3B.gpwmj.cn
http://7zWcpWDk.gpwmj.cn
http://5YN6Q7ya.gpwmj.cn
http://SdK2JFZ0.gpwmj.cn
http://h3GQTUC9.gpwmj.cn
http://5slA5ns0.gpwmj.cn
http://UsXjNlS8.gpwmj.cn
http://LQJiWgU4.gpwmj.cn
http://xAcovi3T.gpwmj.cn
http://43vUkl1x.gpwmj.cn
http://wjZzJyqm.gpwmj.cn
http://Q5CFUErL.gpwmj.cn
http://nO7NFJMF.gpwmj.cn
http://VsqYU3As.gpwmj.cn
http://zEFtm4jG.gpwmj.cn
http://zc7cQlsu.gpwmj.cn
http://qf5YCGKa.gpwmj.cn
http://epoFa9LN.gpwmj.cn
http://ZEfmBU8t.gpwmj.cn
http://pbXxEbYr.gpwmj.cn
http://5q86R82K.gpwmj.cn
http://lFrGU058.gpwmj.cn
http://n1uPWxIr.gpwmj.cn
http://www.dtcms.com/a/377891.html

相关文章:

  • GPU 服务器压力测试核心工具全解析:gpu-burn、cpu-burn 与 CUDA Samples
  • Power Automate List Rows使用Fetchxml查询的一个bug
  • Zynq开发实践(FPGA之ddr sdram读写)
  • LeetCode 热题 160.相交链表(双指针)
  • 西门子 S7-200 SMART PLC 编程:转换 / 定时器 / 计数器指令详解 + 实战案例(案例篇)
  • SAM-Med3D:面向三维医疗体数据的通用分割模型(文献精读)
  • 考研复习-计算机网络-第五章-传输层
  • win11安装jdk8-u211-windows
  • 从传统到智能:3D 建模流程的演进与 AI 趋势 —— 以 Blender 为例
  • 开发避坑指南(46):Java Stream 对List的BigDecimal字段进行求和
  • 在OpenHarmony上适配图形显示【3】——添加显示接口类型
  • Node.js 模块化规范详解
  • Neo4j--登录及简单操作
  • 使用nvm安装Node.js18以下报错解决方案——The system cannot find the file specified.
  • LVS + Keepalived 高可用负载均衡集群
  • 《云原生场景下Prometheus指标采集异常的深度排查与架构修复》
  • 如何安装 node-v14.16.1-x64.msi?Node.js 14.16.1 64位MSI安装详细步骤
  • React 基础
  • 自动化SSL证书管理:应对域名SSL证书更新焦虑
  • 跨平台快速上手:Couchbase 安装与使用指南
  • 【译】Visual Studio 八月更新已发布 —— 更智能的人工智能、更出色的调试功能以及更多控制权
  • python+selenium+PO模式
  • Excel表格如何制作?【图文详解】表格Excel制作教程?电脑Excel表格制作?
  • 【基于CNN的57类交通标志识别系统】
  • 【深度学习新浪潮】Nano Banana(Gemini 2.5 Flash Image)技术解析与开发者实操指南
  • 【Qt开发】显示类控件(二)-> QLCDNumber
  • 三角孔径衍射误差难分析?OAS 软件深度仿真解难题
  • 鸿蒙Next Web组件生命周期详解:从加载到销毁的全流程掌控
  • 【从0开始学习Java | 第17篇】集合(中-Set部分)
  • 【AI指导】Python实现prophet模型的业绩预测