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

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.dtcms.com/a/272957.html

相关文章:

  • Python 网络爬虫中 robots 协议使用的常见问题及解决方法
  • 图解 BFS 路径搜索:LeetCode1971
  • 芯片I/O脚先于电源脚上电会导致Latch-up(闩锁效应)吗?
  • Logback日志框架配置实战指南
  • 5种使用USB数据线将文件从安卓设备传输到电脑的方法
  • 【JavaScript 函数、闭包与 this 绑定机制深度解析】
  • 【C语言】指针笔试题2
  • 模块三:现代C++工程实践(4篇)第二篇《性能调优:Profile驱动优化与汇编级分析》
  • FlashAttention 快速安装指南(避免长时间编译)
  • QT网络通信底层实现详解:UDP/TCP实战指南
  • Centos 7下使用C++使用Rdkafka库实现生产者消费者
  • 【LeetCode 热题 100】19. 删除链表的倒数第 N 个结点——双指针+哨兵
  • 学习 Flutter (一)
  • html的outline: none;
  • C++STL-deque
  • 1. COLA-DDD的实战
  • 【基础架构】——软件系统复杂度的来源(低成本、安全、规模)
  • 告别卡顿与慢响应!现代 Web 应用性能优化:从前端渲染到后端算法的全面提速指南
  • IDEA运行Spring项目报错:java: 警告: 源发行版 17 需要目标发行版 17,java: 无效的目标发行版: 17
  • Cargo.toml 配置详解
  • 【科研绘图系列】R语言探索生物多样性与地理分布的可视化之旅
  • 网安-解决pikachu-rce乱码问题
  • 访问Windows服务器备份SQL SERVER数据库
  • (C++)任务管理系统(文件存储)(正式版)(迭代器)(list列表基础教程)(STL基础知识)
  • x86交叉编译ros 工程给jetson nano运行
  • Rust and the Linux Kernel
  • Sophix、Tinker 和 Robust 三大主流 Android 热修复框架的详细对比
  • windows10 安装docker到H盘
  • Linux 服务器挖矿病毒深度处理与防护指南
  • 使用Docker将Python项目部署到云端的完整指南