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

【牛客CM11】链表分割

刷爆LeetCode系列

  • 牛客CM11:
  • github地址
  • 前言
  • 题目描述
  • 题目与思路分析
  • 代码实现
  • 算法代码优化

牛客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 = new ListNode(-1);
ListNode* guardGreater = new ListNode(-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

  • 释放手动开辟的哨兵位头结点

  •   delete guardGreater;delete guardLess;
    
  • 最终返回新链表的头结点return pHead

在这里插入图片描述

代码实现

class Partition {public:ListNode* partition(ListNode* pHead, int x) {if (pHead == nullptr)return nullptr;ListNode* guardLess = new ListNode(-1);ListNode* guardGreater = new ListNode(-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;}
};

算法代码优化

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

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

分享到此结束啦
一键三连,好运连连!

你的每一次互动,都是对作者最大的鼓励!


征程尚未结束,让我们在广阔的世界里继续前行! 🚀

http://www.dtcms.com/a/540986.html

相关文章:

  • .NET 对象转Json的方式
  • 广西住建局官方网站大数据营销的应用领域
  • Linux ioctl 深度剖析:从原理到实践
  • 网站备案流程解答做最漂亮的网站
  • LED驱动电路(三)
  • Keil工程编译垃圾清理
  • 同城跑腿APP源码开发技术全景:即时订单、骑手定位与路线优化算法
  • 【数据工程】15. Stream Query Processing
  • 鄂州网站设计效果wordpress comment_form_after
  • 爱网站关键词查询工具潍坊营销网站
  • java程序生成pdf或wod乱码
  • 做网站和游戏是如何赚钱crm系统开发
  • 网页pdf下载攻略--以混元上传的pdf为例
  • AI在处理扫描版PDF时准确率低,如何提升?
  • 网站做成软件免费wordpress 首页制作
  • 所有网站打不开深圳做app网站的公司名称
  • centos 7 redhat7 升级内核 升级内核到5.4版本 202510试过可以成功
  • 什么是TC8?
  • EtherNet/IP转ProfiNet智能网关配置指南:西门子1500PLC与多台机器人通讯
  • 【仿真测试】基于FPGA的完整BPSK通信链路实现,含频偏锁定,帧同步,定时点,Viterbi译码,信道,误码统计
  • 晨控CK-UR08-E01与汇川AC系列PLC配置EtherNet/IP通讯连接手册
  • 稀疏Ax=b超静定方程的常用解法介绍
  • AnyBurn 多功能光盘刻录软件 v6.5
  • FPGA在AI时代的定位?
  • 网站是如何盈利的如何做一个营销型网站
  • 宁波网站推广合作商平面广告创意设计
  • 融资台州网站快速优化排名
  • p2p网贷网站建设公司晋州住房保障建设局网站
  • 2025年--Lc218-145. 二叉树的后序遍历(非递归版,栈,带测试用例)-Java版
  • docker ubuntu22.04更新报错问题——筑梦之路