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

02.04、分割链表

02.04、[中等] 分割链表

1、题目描述

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

你不需要 保留 每个分区中各节点的初始相对位置。

2、解题思路

本题要求将链表分隔,使得所有小于 x 的节点排在大于或等于 x 的节点之前。链表中的节点顺序不需要保持。我们的目标是创建两个链表,一个存储小于 x 的节点,另一个存储大于等于 x 的节点,最后将两个链表拼接起来。

  1. 创建两个链表:
    • 一个用于存放小于 x 的节点 (less)。
    • 一个用于存放大于等于 x 的节点 (greater)。
  2. 遍历原链表:
    • 对于每个节点,判断其值与 x 的大小:
      • 如果节点值小于 x,将其添加到 less 链表。
      • 如果节点值大于等于 x,将其添加到 greater 链表。
  3. 拼接两个链表:
    • 遍历完原链表后,将 less 链表的最后一个节点指向 greater 链表的头节点。
    • greater 链表的最后一个节点需要指向 null,表示链表的结束。
  4. 返回结果:
    • 返回 less 链表的头节点(即跳过辅助节点)。

3、代码实现与详细注释

class Solution {
public:ListNode* partition(ListNode* head, int x) {// 创建两个虚拟节点作为新链表的头,一个用于小于x的节点,另一个用于大于等于x的节点ListNode* less = new ListNode(0);   // 用于存放小于x的节点ListNode* greater = new ListNode(0); // 用于存放大于等于x的节点// 初始化当前遍历的指针,以及两个链表的末尾指针ListNode *cur = head, *cur1 = less, *cur2 = greater;// 遍历整个链表while (cur) {if (cur->val < x) {// 当前节点值小于x,将该节点加入到less链表cur1->next = cur;cur1 = cur1->next;  // 移动less链表末尾指针} else {// 当前节点值大于等于x,将该节点加入到greater链表cur2->next = cur;cur2 = cur2->next;  // 移动greater链表末尾指针}// 移动到链表的下一个节点cur = cur->next;}// 将less链表与greater链表连接起来cur1->next = greater->next;// 将greater链表的最后一个节点指向null,避免成环cur2->next = nullptr;// 返回less链表的头节点,跳过第一个虚拟节点return less->next;}
};

4、关键点总结

  1. 虚拟节点:
    • 使用 ListNode() 创建虚拟头节点,避免处理头节点的特殊情况,简化代码逻辑。
  2. 链表拼接:
    • 遍历原链表的过程中,将节点分别加入到 lessgreater 链表。遍历完后,将 less 链表与 greater 链表拼接在一起。
  3. 尾节点处理:
    • 注意在拼接链表后,greater 链表的最后一个节点需要指向 nullptr,防止链表成环。

5、时间复杂度与空间复杂度

  • 时间复杂度: O(n),其中 n 是链表的长度。我们只遍历了链表一次。
  • 空间复杂度: O(1),因为我们只是创建了两个辅助链表指针,额外空间与输入大小无关。
http://www.lryc.cn/news/462413.html

相关文章:

  • Excel 中根据患者的就诊时间标记病例为“初诊”或“复诊”
  • 遇到“mfc100u.dll丢失”的系统错误要怎么处理?科学修复mfc100u.dll
  • [Linux] 逐层深入理解文件系统 (1)—— 进程操作文件
  • RT-Thread 互斥量的概念
  • 6.计算机网络_UDP
  • Windows应急响蓝安服面试
  • PCL 点云配准-4PCS算法(粗配准)
  • 12、论文阅读:利用生成对抗网络实现无监督深度图像增强
  • Axure重要元件三——中继器表单制作
  • DMAIC赋能智能家居:解锁未来生活新篇章!
  • 代码随想录算法训练营第二天| 209.长度最小的子数组 59.螺旋矩阵II 区间和 开发商购买土地
  • mysql隐藏索引
  • etcd入门到实战
  • Build an Android project and get a `.apk` file on a Debian 11 command line
  • 解读 Java 经典巨著《Effective Java》90条编程法则,第4条:通过私有构造器强化不可实例化的能力
  • Vivado HLS学习
  • 一款AutoXJS现代化美观的日志模块AxpLogger
  • 成都睿明智科技有限公司共创抖音电商新篇章
  • Spark的安装配置及集群搭建
  • 网络编程基础-IO模型深入理解
  • go 语言学习路线图(一)
  • 前端自动化部署,Netlify免费满足你
  • Linux的开发工具gcc Makefile gdb的学习
  • 基于SSM出租车管理系统的设计
  • iPhone照片内存怎么清理,参考这些方法
  • 【Triton教程】向量相加
  • 关于CSS中毛玻璃和滤镜使用总结
  • 陷入产出危机的我聊聊近况
  • HarmonyOS 开发知识总结
  • [WPF初学到大神] 1. 什么是WPF, MVVM框架, XAML?