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

极致性能的服务器Redis之Hash类型及相关指令介绍

极致性能的服务器Redis之Hash类型及相关指令介绍

目录 1. Hash介绍 2. hset 3. hget 3. hdel 5. hkeys 6. hvals 编辑 7. hgetall  8. hexists 9. hmget 10. hlen 11. hsetnx 12. hincrby 13. hincrbyfloat 1. Hash介绍 Redis 哈希类型是键值对的集合,字段与值均支持字符串、数字等类型,适合建模用户信息、配置项等对象类数据。其支持单字段 / 多字段的增删改查、字段存在性判断、值自增自减等原子操作,且底层通过压缩列表或哈希表优化存储,空间利用率高、查询效率快,是 Redis 中存储结构化数据的核心类型之一。 在Redis中因为本身就是按照哈希的KV结构来进行存储的,所以当我们想要使用Redis里面的哈希的时候,实际上是哈希的哈希,在后者中,

By Ne0inhk
环形房屋如何 “安全劫舍”?动态规划解题逻辑与技巧

环形房屋如何 “安全劫舍”?动态规划解题逻辑与技巧

环形房屋如何 “安全劫舍”?动态规划解题逻辑与技巧 * 1、问题描述 * 2、解题思路 * 3、动态规划解法 * 3.1 辅助函数 * 3.2 主函数 * 4、代码解析 * 5、复杂度分析 * 6、测试用例 * 7、关键点总结 * 8、常见问题解答 🌺The Begin🌺点点关注,收藏不迷路🌺 1、问题描述 你是一个专业的小偷,计划偷窃环形排列的房屋。每间房屋都有一定金额,但如果偷窃相邻的两间房屋就会触发警报。计算在不触发警报的情况下能够偷窃到的最高金额。 2、解题思路 这个问题是经典打家劫舍问题的变种,房屋排列成环形。我们可以将其分解为两个子问题: 1. 不偷第一间房屋 2. 不偷最后一间房屋 然后取这两个子问题的最大值作为最终结果。 3、动态规划解法 3.1

By Ne0inhk

多模态算法面经准备

目录 * 小米-多模态算法工程师 * 1、对多模态大模型的了解 * 1.1 CLIP * 1.2 BLIP * 1.3 BLIP-2 * 2、文生图、图生图? * 3、目前的图像或视频编码器,核心思想方法是什么? * 4、GPT * 4、语义分割模型与指标 * 4.1 Unet * 4.2 DeepLab * 4.3 语义分割的损失函数 * 4.4 评价指标 小米-多模态算法工程师 1、对多模态大模型的了解 1.1 CLIP CLIP利用对比学习(Contrastive Learning)对图像和文本进行联合训练。 1.2 BLIP 原文 BLIP的模型架构包括4个关键部分:

By Ne0inhk
【递归、搜索与回溯算法必刷42题:专题一】从汉诺塔问题到快速幂

【递归、搜索与回溯算法必刷42题:专题一】从汉诺塔问题到快速幂

🎬 个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬 艾莉丝的简介: 🎬艾莉丝的算法专栏简介: 文章目录 * 本文设计专题一算法题链接 * 1 汉诺塔问题 * 题目描述 * 汉诺塔问题(递归解法) * 1. 问题描述 * 2. 递归思想 * 基本情况(递归终止条件) * 递归分解(n ≥ 2) * 3. 递归算法流程(函数设计) * 函数头 * 递归函数流程: * 解题过程 * 算法实现(C++) * 2 合并两个有序链表 * 题目描述 * 解题过程 * 算法实现(

By Ne0inhk