【牛客CM11】链表分割

【牛客CM11】链表分割

刷爆LeetCode系列

牛客CM11:

github地址

有梦想的电信狗

前言

本文用C++实现牛客CM11


题目描述

题目链接https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70?tpId=8&&tqId=11004&rp=2&ru=/activity/oj&qru=/ta/cracking-the-coding-interview/question-ranking

在这里插入图片描述

题目与思路分析

目标分析

  1. 编写代码,给定链表的头指针pHead以给定值x为基准,将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
  2. 不能改变原来数据的顺序
  3. 返回分割后的新链表的头指针
  4. 要求:时间复杂度为O(n),空间复杂度为O(1)

思路:创建两个哨兵位的头结点guardLessguardGreater,遍历链表,小于 x 的结点尾插guardLess,大于 x 的结点尾插guardGreater,最终再将两个链表连接起来,尾插的时候注意记录tail结点

操作

  • 空链表检查if (pHead == nullptr) return nullptr;
  • 创建两个哨兵位的头结点
ListNode* guardLess =newListNode(-1); ListNode* guardGreater =newListNode(-1);
  • 分别创建两个链表的尾结点,方便尾插时无需频繁找尾
ListNode* lessTail = guardLess,*greaterTail = guardGreater 
  • curNode为移动指针,用于遍历链表
    • 小于 x 的结点尾插到 guardLess 链表中,同时尾指针 lessTail 向后移动
    • 大于等于 x 的结点尾插到 guardGreater 链表中,同时尾指针 greaterTail 向后移动
    • 每次循环中curNode指针向后移动curNode = curNode->next
  • 连接两个新链表lessTail->next = guardGreater->next
  • 最后一个结点的 next 指针需要置空,防止链表带环greaterTail->next = nullptr
  • 保存新链表的头结点pHead = guardLess->next
  • 释放手动开辟的哨兵位头结点
  • 最终返回新链表的头结点return pHead
delete guardGreater;delete guardLess;
在这里插入图片描述

代码实现

classPartition{public: ListNode*partition(ListNode* pHead,int x){if(pHead ==nullptr)returnnullptr; ListNode* guardLess =newListNode(-1); ListNode* guardGreater =newListNode(-1); ListNode* lessTail = guardLess,*greaterTail = guardGreater; ListNode* curNode = pHead;while(curNode){if(curNode->val < x){ lessTail->next = curNode; lessTail = lessTail->next;}else{ greaterTail->next = curNode; greaterTail = greaterTail->next;} curNode = curNode->next;}// 链接两个链表 lessTail->next = guardGreater->next;// 最后一个结点的 next 指针需要置空,防止链表带环 greaterTail->next =nullptr;// 释放哨兵位的头结点 pHead = guardLess->next;delete guardGreater;delete guardLess;return pHead;}};

算法代码优化

  • 以上代码和思路已足够精简,无需优化

以上就是本文的所有内容了,如果觉得文章对你有帮助,欢迎 点赞⭐收藏 支持!如有疑问或建议,请在评论区留言交流,我们一起进步

分享到此结束啦
一键三连,好运连连!
你的每一次互动,都是对作者最大的鼓励!征程尚未结束,让我们在广阔的世界里继续前行! 🚀

Read more

【数据结构入坑指南(二.1)】--《数据结构与算法精讲:从数组到顺序表,如何让数据管理变得强大而优雅?》​​

【数据结构入坑指南(二.1)】--《数据结构与算法精讲:从数组到顺序表,如何让数据管理变得强大而优雅?》​​

🔥@晨非辰Tong:个人主页  👀专栏:《C语言》、《数据结构与算法》 💪学习阶段:C语言、数据结构与算法初学者 ⏳“人理解迭代,神理解递归。” 引言:掌握了复杂度的衡量标尺,现在,让我们用它来审视第一个真正意义上的数据结构——顺序表。本文将亲手实现动态顺序表,并分析其各项操作的效率,为下一篇博客对顺序表的继续分享打通前路。 目录 一、线性表 二、顺序表 2.1  什么是顺序表? 2.2  顺序表类别 2.2.1  静态顺序表 2.2.2  动态顺序表 三、动态顺序表的实现(三文件协同) SeqList.h SeqList.c test.c(测试文件) 四、动态顺序表的应用(初)

By Ne0inhk
生物启发算法:模仿人类司机的认知机制

生物启发算法:模仿人类司机的认知机制

生物启发算法:模仿人类司机的认知机制 * 前言 * 一、生物启发算法的基础概念 * 1.1 什么是生物启发算法 * 1.2 生物启发算法的特点 * 1.3 常见的生物启发算法 * 二、人类司机的认知机制 * 2.1 感知阶段 * 2.2 决策阶段 * 2.3 执行阶段 * 三、模仿人类司机认知机制的生物启发算法设计 * 3.1 基于感知阶段的算法模块设计 * 3.2 基于决策阶段的算法模块设计 * 3.3 基于执行阶段的算法模块设计 * 四、算法的实现与验证 * 4.1 开发环境与工具 * 4.2 算法的代码实现 * 4.3 算法的验证方法 * 4.4 验证结果分析

By Ne0inhk
21届智能车雁过留痕备战指南|龙邱科技STC+神眼摄像头处理 高效搜线算法思路分享

21届智能车雁过留痕备战指南|龙邱科技STC+神眼摄像头处理 高效搜线算法思路分享

今年STC单片机首次增设摄像头组别,相信不少备战的同学想要知道这颗新U是否能够快速上手并能够像传统摄像头组别一样,高效完成图像处理,提高车模控制系统上限。 其中最突出的痛点的是:有同学搭建完核心算法组合后,可能感觉到略微卡顿或系统延迟,影响车模调试上限,我们第一次搭建完经过测试单帧处理耗时高达20多ms,这导致车辆运行稳定性和反应速度受限、甚至可能有冲出赛道的情况发生,导致调试陷入瓶颈,提速困难,短时间内难以找到有效突破方向。 针对这一高频痛点,我们结合备战同学的实际调试场景,经过反复测试、迭代优化,整理出一套实用性极强的帧率优化思路,实测验证有效,优化后单帧处理耗时可稳定降至9-11ms,彻底解决卡顿难题,这里将图像处理和以西优化思路分享给大家,希望能够帮助到更多的同学! 实测数据对比,直观呈现优化效果 图像处理方案单帧采集+处理耗时未优化(采集+处理)20ms-25ms(能感觉到慢,上限较低)优化后(采集+处理)9ms-11ms(流畅稳定,提高了上限) 同学们遇到的卡顿问题,核心症结主要集中在两点:一是内存资源不足,二是算法计算耗时过长。在拆解具体优化方法前,我

By Ne0inhk
LeetCode 42接雨水全解:暴力超时→DP降维打击→双指针极限压缩空间→单调栈栈式凹槽定位,全景式解析算法优化路径

LeetCode 42接雨水全解:暴力超时→DP降维打击→双指针极限压缩空间→单调栈栈式凹槽定位,全景式解析算法优化路径

文章目录 * 本篇摘要 * LeetCode 42 接雨水 详解 * ① 暴力解法(多循环嵌套,卡超时,因此后续使用了两种基于暴力优化的方法) * ② 动态规划解法 * 核心思想 * 步骤(三步走) * 举例说明 * 代码实现思路 * ③ 双指针解法(优化对应的dp的空间复杂度变成O(1)) * 双指针优化思路 * ④单调栈解法 * 单调栈简介 * 核心特点 * 常见用途 * 左边最近比当前数大的数(用单调栈) * 步骤: * 示例: * 最终结果: * 单调栈一般模版 * 关键点 * 注意点 * 单调栈不同选型需求 * 优势 * 引入单调栈 * 本篇小结 本篇摘要 本篇围绕LeetCode 42“接雨水”展开,剖析四种解法:暴力法通过嵌套循环统计每柱接水量,易超时;动态规划预先记录左右最大值,将复杂度降至O(n);双指针边遍历边更新极值,空间优化至O(1

By Ne0inhk