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

Leetcode刷题营第十九题:对链表进行插入排序

147. 对链表进行插入排序

给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。

插入排序 算法的步骤:

  1. 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
  2. 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
  3. 重复直到所有输入数据插入完为止。

下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中。

对链表进行插入排序。

示例 1:

输入: head = [4,2,1,3]
输出: [1,2,3,4]

示例 2:

输入: head = [-1,5,3,4,0]
输出: [-1,0,3,4,5]

提示:

  • 列表中的节点数在 [1, 5000]范围内
  • -5000 <= Node.val <= 5000

思路:遍历链表,每次拿下一个节点,新拿下的节点跟之前拿下的节点进行比较,再进行链表的插入。

代码实现:

struct ListNode* insertionSortList(struct ListNode* head) {if(head == NULL || head->next == NULL){return head;}struct ListNode* Cur = head->next;struct ListNode* new_head = head;new_head->next = NULL;while (Cur){   struct ListNode* new_Cur = new_head;struct ListNode* Next = Cur->next;if(Cur->val < new_Cur->val){Cur->next = new_Cur;new_head = Cur;}else{struct ListNode* prev = new_Cur;new_Cur =new_Cur->next;while (new_Cur && Cur->val >= new_Cur->val){prev = new_Cur;new_Cur =new_Cur->next;}prev->next = Cur; Cur->next = new_Cur;}Cur = Next;}return new_head;
}

这里同样我们可以使用到哑指针进行优化!

struct ListNode* insertionSortList(struct ListNode* head) {if (head == NULL || head->next == NULL)return head;struct ListNode dummy;dummy.next = NULL;  // dummy 作为新排序链表头部struct ListNode* cur = head;while (cur) {struct ListNode* next = cur->next;// 在 dummy 链中找插入位置struct ListNode* prev = &dummy;while (prev->next && prev->next->val < cur->val) {prev = prev->next;}// 插入 cur 节点到 prev->next 前面cur->next = prev->next;prev->next = cur;cur = next; // 处理下一节点}return dummy.next;
}

这里对链表的插入需要注意前后节点的指向,需要改变前后节点所指向的位置!

本期就到这结束了,谢谢大家的点赞收藏!!!

http://www.xdnf.cn/news/15036.html

相关文章:

  • (LeetCode 每日一题) 3440. 重新安排会议得到最多空余时间 II (贪心)
  • 智能体的记忆系统:短期记忆、长期记忆与知识图谱
  • EFK/ELK9.0.3 windows搭建
  • ASP.NET Core 8 轻松配置Serilog日志
  • STM32-定时器输入捕获
  • 通用游戏前端架构设计思考
  • 20-C#构造函数--虚方法
  • 小程序软装: 组件库开发
  • 爬虫-正则表达式
  • 汽车功能安全-软件单元验证 (Software Unit Verification)【用例导出方法、输出物】8
  • skywalking-agent-docker镜像
  • C++11 std::move与std::move_backward深度解析
  • 数据分析框架和方法
  • 华为静态路由配置
  • mysql 可用性的保障机制:主讲主从复制机制
  • sqlplus表结构查询
  • CTFHub————Web前置技能[HTTP协议(302跳转、Cookie)]
  • 【数据分析】多数据集网络分析:探索健康与退休研究中的变量关系
  • IntelliJ IDEA 2025.1.3创建不了java8的项目
  • 洛谷 P1104 生日---排序
  • VS2022 C++ EasyX库 扫雷游戏项目开发:打造经典游戏的详细之旅
  • JavaScript基础篇——第五章 对象(最终篇)
  • whitt算法之特征向量的尺度
  • [数学基础] 矩阵的秩及其应用
  • K8S使用命令多集群管理配置
  • Java异步编程全解析:从基础到高阶实战
  • C#基础篇(09)结构体(struct)与类(class)的详细区别
  • 安卓设备信息查看器 - 源码编译
  • PiscTrace深蹲计数功能实现:基于 YOLO-Pose 和人体关键点分析
  • Unity Demo-3DFarm详解-其二