【牛客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

让你的笔记不会丢失!! Obsidian与gitee同步笔记教程

让你的笔记不会丢失!! Obsidian与gitee同步笔记教程

步骤大纲: - 安装git -通过git仓库设置需要传入的文件 -注册Gitee(或者Github) -新建一个仓库 -初始化本地库 -在Obsidian中安装Git插件 -设置插件 -测试即可 ---------------------------------------------------------- Obsidian是一款功能强悍的笔记软件 ,我一直再用这款软件 ,里面的关系图谱就十分的高级 ,给自己一种技术大拿的感觉 ,也是反馈非常好 ,强推这款软件!!! ----------------------------------------------------------- 设计同步的初衷: 极特殊情况:电脑突然坏了 ,笔记如果没有进行同步就丢了 ,如果记了很多内容那还是很可惜的 另外就是:我在笔记本电脑上面用的这款软件 ,但是有时候在某些场合笔记本不方便使用 ,想复习一下笔记内容就没有办法做到 ,同步以后就可以支持双端观看 ,解决了这个问题 ,复习笔记内容更久快捷 ,在不方便的场合下也可以达到复盘笔记的目的 .    因为Obsidian自带

By Ne0inhk
使用开源三件套OpenClaw+Ollama+1Panel部署7×24运行

使用开源三件套OpenClaw+Ollama+1Panel部署7×24运行

一、写在前面 本次操作教程将以开源 Linux 服务器运维面板 1Panel 为基础,搭配 Ollama 本地大模型(无需担心 Token 消耗费用),手把手教你部署 OpenClaw 个人 AI 助理,实现 7×24 小时稳定运行,轻松拥有专属智能助手! 二、资源准备 本次 OpenCalw 本地个人 AI 助理基于一台腾讯 GPU 云服务器构建,云服务器获取过程不做赘述,参见腾讯云官网。其中服务器的配置参见如下: * 操作系统:Ubuntu Server 24.04 LTS 64 位 * 计算资源:20 核 80 G * 磁盘容量:100G

By Ne0inhk

GitHub 上开源了 30+ 个 OpenClaw 真实使用案例。

最近逛 GitHub 的时候发现了一个挺有意思的仓库,专门收集 OpenClaw 的 usecases。 说实话,很多人装完 OpenClaw 之后的操作都是一样的:疯狂往里面塞各种 Skill,ClawHub 逛得跟菜市场一样热闹,今天装个天气查询,明天装个股票分析,后天又来个翻译助手。 结果装了一堆却发现每天还是在信息搜索、做个记录。Skill 装了一百个,生活一点没变轻松。 这个开源项目就是专门收集人们真实在用的 OpenClaw 场景,而不是单纯介绍某个 Skill 或插件。 01 开源项目简介 awesome-openclaw-usecases 目前收录了 30 多个经过验证的真实使用场景。 它的核心理念非常简单:不是教你装什么 Skill,而是告诉你别人是怎么把 OpenClaw 变成真正能帮人类干活的私人助理的。 如果你不知道 OpenClaw 具体能做什么,只停留在抽象概念。有一些自动化或搭建 AI 智能体想法,但不知道如何系统落地,想参考别人已经跑通的真实工作流和自动化方案。

By Ne0inhk
Enterprise Architect 16 下载、安装与无限30天操作

Enterprise Architect 16 下载、安装与无限30天操作

文章目录 * Enterprise Architect 16 简介 * (一)支持多种建模语言和标准 * (二)强大的版本控制、协作和文档管理功能 * (三)增强的技术和用户体验 * (四)高级功能和扩展性 * 一,下载软件 * (一)官网 * (二)阿里云盘 * (三)百度网盘 * (四)迅雷 * 二,安装软件 * 三,无限30天设置 * (一)删除`fkey.dat`文件 * (二)删除注册表Kane文件夹 * (三)查看效果 Enterprise Architect 16 简介 Enterprise Architect 16是一款功能强大的企业级建模工具,它为企业和机构在系统设计、业务流程建模、数据建模以及软件开发等方面提供了全面的支持。以下是对Enterprise Architect 16的详细介绍:

By Ne0inhk