【数据结构】LeetCode160.相交链表 138.随即链表复制 牛客——链表回文问题

文章目录

    • 一、相交链表问题
      • 问题描述
      • 解题思路分析
        • 思路一:暴力遍历法
        • 思路二:双指针对齐法(最优解)
    • 二、链表的回文结构
      • 问题描述
      • 解题思路
      • 完整代码
    • 三、 随即链表的复制
      • 问题描述
      • 解题思路
      • 复杂度分析

一、相交链表问题

问题描述

给定两个单链表,判断它们是否相交,若相交则返回相交的节点。(注意:判断依据是节点地址是否相同,而非节点值,因为节点值可能存在重复。)


在这里插入图片描述

解题思路分析

思路一:暴力遍历法
  • 方法:遍历链表A,对于A中的每一个节点,遍历整个链表B,检查是否存在地址相同的节点。
  • 时间复杂度:O(M*N)(若两链表长度分别为M和N)
  • 空间复杂度:O(1)
  • 缺点:效率低,不适用于长链表。
思路二:双指针对齐法(最优解)
  • 方法:
    1. 分别遍历两个链表,计算各自长度。
    2. 求出两链表长度差 gap
    3. 让较长的链表的指针先移动 gap 步。
    4. 然后两个指针同时移动,逐个比较节点地址,第一个相同的节点即为交点。
  • 时间复杂度:O(M + N)
  • 空间复杂度:O(1)
  • 优点:高效,适用于任意长度的链表。

在这里插入图片描述

思路2的时间复杂度更低,所以我们选择思路2

具体代码如下

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* curA=headA,*curB=headB;int lenA=1,lenB=1;while(curA->next){curA=curA->next;lenA++;}while(curB->next){curB=curB->next;lenB++;}int gap=abs(lenA-lenB);//假设法 先假设A长struct ListNode* longList=headA;struct ListNode* shortList=headB;if(lenA<lenB){longList=headB;shortList=headA;}while(gap--){longList=longList->next;}while(longList){if(longList==shortList)return longList;longList=longList->next;shortList=shortList->next;}return NULL;
}

二、链表的回文结构

问题描述

判断一个单链表是否为回文结构。即正着读和反着读都一样

在这里插入图片描述

解题思路

回文链表判断的关键在于对称性验证。我们可以通过以下步骤实现:

  1. 找到中间节点:使用快慢指针法,快指针每次走两步,慢指针每次走一步,当快指针到达末尾时,慢指针正好在中间。
  2. 反转后半部分链表:从中间节点开始,将后半部分链表反转。
  3. 比较前后两部分:从头节点和反转后的中间节点开始,逐个比较节点值是否相同。

完整代码

class PalindromeList {
public://寻找中间节点
struct ListNode* middleNode(struct ListNode* head) {// 初始化快慢指针struct ListNode* slow = head;struct ListNode* fast = head;// 移动指针直到fast到达链表末尾while (fast != NULL && fast->next != NULL) {slow = slow->next;      // 慢指针每次移动一步fast = fast->next->next; // 快指针每次移动两步}return slow; // 慢指针指向中间节点
}//反转链表
struct ListNode* reverseList(struct ListNode* head) {struct ListNode* n1, *n2, *n3;n1 = NULL;n2 = head;if (n2)n3 = n2->next;while (n2) {n2->next = n1;n1 = n2;n2 = n3;if (n3)n3 = n3->next;}return n1;
}bool chkPalindrome(ListNode* A) {// write code herestruct ListNode*mid=middleNode(A);struct ListNode*rmid=reverseList(mid);while(rmid&&A){if(rmid->val!=A->val)return false;rmid=rmid->next;A=A->next;}return true;
}};

三、 随即链表的复制

问题描述

实现一个函数,复制一个含有随机指针的链表。随机指针可以指向链表中的任何节点或为空。

在这里插入图片描述

解题思路

常规链表的复制很简单,但随机指针的存在使得问题复杂化。因为随机指针可能指向尚未复制的节点。我们可以通过以下三步解决:

  1. 插入拷贝节点:在原链表的每个节点后插入一个拷贝节点,值与原节点相同。
  2. 设置随机指针:拷贝节点的随机指针应指向原节点随机指针所指节点的下一个节点(即其拷贝)。
  3. 分离链表:将混合链表分离为原链表和拷贝链表。

在这里插入图片描述

struct Node* copyRandomList(struct Node* head) {//拷贝节点插到原节点后边
struct Node*cur=head;while(cur)
{struct Node* copy=(struct Node*)malloc(sizeof(struct Node));//分配内存copy->next=cur->next;cur->next=copy;copy->val=cur->val;cur=copy->next;//cur走到原链表的下一个  
}
//控制randomcur=head;
while(cur)
{struct Node* copy = cur->next;if(cur->random==NULL)//不要写成random==NULL{copy->random=NULL;}else{copy->random=cur->random->next;//核心代码}cur=copy->next;
}//把拷贝链表尾插起来
struct Node* copyhead=NULL,*copytail=NULL;cur=head;
while(cur)
{struct Node*copy=cur->next;if(copytail==NULL){copyhead=copytail=copy;}else{copytail->next=copy;copytail=copytail->next;}cur=copy->next;
}
return copyhead;
}

复杂度分析

  • 时间复杂度:O(N),三次遍历链表。
  • 空间复杂度:O(1),除了返回的拷贝链表外,仅使用了常数个额外指针。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96780.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql InnoDB 底层架构设计、功能、原理、源码系列合集【四、事务引擎核心 - MVCC与锁机制】

Mysql InnoDB 底层架构设计、功能、原理、源码系列合集 一、InnoDB 架构先导。【模块划分&#xff0c;各模块功能、源码位置、关键结构体/函数】 二、内存结构核心 - 缓冲池与性能加速器 三、日志系统 - 事务持久化的基石 四、事务引擎核心 - MVCC与锁机制 五、InnoDB 高阶…

[ pytorch ] 基于CLIP的zero-shot图像分类

论文&#xff1a;Learning Transferable Visual Models From Natural Language Supervision 地址&#xff1a;Learning Transferable Visual Models From Natural Language Supervision 一、关于CLIP 基于图文匹配的特征学习&#xff1a;该论文证明了预测哪个标题与哪个图像…

SP95N65CTO:一款高性能650V SiC MOSFET的全面解析

碳化硅&#xff08;SiC&#xff09;功率器件因其优异的性能&#xff0c;在高频、高温、高效率的应用中越来越受到重视。本文将以SP95N65CTO为例&#xff0c;详细介绍这款650V SiC MOSFET的关键特性、电气参数与应用场景。一、产品概述SP95N65CTO是一款采用TOLI&#xff08;TO-2…

week4-[二维数组]平面上的点

week4-[二维数组]平面上的点 题目描述 有 NNN 个二维平面上的点&#xff0c;每个点的坐标都是整数且坐标范围都在 0∼9990\sim 9990∼999 之间&#xff0c;求其中出现最频繁的点的出现次数及其坐标。 输入格式 第一行有一个整数 NNN&#xff0c;表示平面上点的个数。 接下来 NN…

领域专用AI模型训练指南:医疗、法律、金融三大垂直领域微调效果对比

领域专用AI模型训练指南&#xff1a;医疗、法律、金融三大垂直领域微调效果对比 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般绚烂的技术栈中&#xff0c;我是那个永不停歇的色彩收集者。 &#x1f98b; 每一个优化都是我培育的花朵&#xff0…

在自动驾驶中ESKF实现GINS时,是否将重力g作为变量考虑进去的目的是什么?

在自动驾驶的ESKF中&#xff0c;是否将重力 g 作为估计变量&#xff0c;可以从多个维度来比较这两种方法的差异。对比维度不将重力 g 作为变量将重力 g 作为变量核心假设重力矢量 g 是已知且恒定的完美参考量。重力矢量 g 是需要被估计或校准的量&#xff0c;其值可能存在不确定…

Dify 从入门到精通(第 55/100 篇):Dify 的模型微调(进阶篇)

Dify 从入门到精通&#xff08;第 55/100 篇&#xff09;&#xff1a;Dify 的模型微调 Dify 入门到精通系列文章目录 第一篇《Dify 究竟是什么&#xff1f;真能开启低代码 AI 应用开发的未来&#xff1f;》介绍了 Dify 的定位与优势第二篇《Dify 的核心组件&#xff1a;从节点…

《Password Guessing Using Large Language Models》——论文阅读

1.研究背景LLM在文本生成和理解方面表现出色&#xff0c;但直接用于密码猜测存在以下问题&#xff1a;密码与自然语言的差异&#xff08;短、无语法、需精确匹配&#xff09;生成效率低、重复率高伦理限制&#xff08;如GPT-4拒绝生成大量密码&#xff09;2.本文研究提出PASSLL…

C# 使用OPCUA 与CODESYS进行标签通讯

目录 1.导出的标签 识别标签名称 2.引用OPCUA的包 3.读写方法的封装 4.完整的业务模块封装 1.导出的标签 识别标签名称 从CODESYS导出使用标签通讯的模块文档 大概是这样子的 <?xml version"1.0" encoding"utf-8"?> <Symbolconfiguratio…

C++ 中 `std::map` 的 `insert` 函数

1. 函数的概念与用途 std::map::insert 是 C 标准模板库&#xff08;STL&#xff09;中 map 容器的一个核心成员函数。它的核心任务很明确&#xff1a;向 map 中插入一个新的键值对&#xff08;key-value pair&#xff09;。 核心用途&#xff1a; 数据构建&#xff1a;初始化一…

【机器学习学习笔记】机器学习引言

前言本文章是拨珠自己的学习笔记&#xff0c;自用为主&#xff0c;学习请移步专门教程&#xff0c;若有错误请大佬轻喷&#xff0c;也欢迎同好交流学习。本文将阐述三个问题。什么是机器学习&#xff1f;监督学习、无监督学习到底在干什么&#xff1f;分类、回归、聚类又是怎么…

程序设计---状态机

在软件工程、嵌入式开发、自动化控制等领域&#xff0c;状态机&#xff08;State Machine&#xff09;是一种描述系统行为的强大工具。它通过抽象“状态”“事件”“转换”和“动作”四大核心要素&#xff0c;将复杂的逻辑流程转化为可视化、可验证的状态流转规则&#xff0c;广…

GaussDB 数据库架构师修炼(十八) SQL引擎-分布式计划

1 分布式架构GaussDB基于MPP &#xff08;Massively Parallel Processing&#xff09; 并行架构Streaming流式计算框架2 分布式计划CN轻量化&#xff08;light proxy&#xff09; FQS&#xff08; fast query shipping &#xff09; STREAM计划 XC计划计划类型场景原理CN…

微前端架构核心要点对比

1. 样式隔离 常见的隔离方式有以下几种,还是根据自身业务来确定: 1.1. shadowDOM 目前相对来说使用最多的样式隔离机制。 但shadowDOM并不是银弹,由于子应用的样式作用域仅在 shadow 元素下,那么一旦子应用中出现运行时“翻墙”跑到外面构建 DOM 的场景,必定会导致构建…

VMware 17.6安装包下载与保姆级图文安装教程!

软件下载 [软件名称]&#xff1a;VMware 17.6 [软件大小]&#xff1a;226.66MB [系统环境]&#xff1a;win 7/8/10/11或更高&#xff0c;64位操作系统 VMware合集&#xff0c;软件下载&#xff08;夸克网盘需手机打开&#xff09;&#xff1a;&#xff1a;VMware合集丨夸克网…

关于微服务下的不同服务之间配置不能通用的问题

问题引入现有两个服务&#xff0c;一个是 A 服务&#xff0c;一个是 B 服务&#xff0c;并且这两个服务都需要使用 mysql。现 B 服务中引入了 A 服务的依赖&#xff0c;在 A 服务中添加了 mysql 的相关配置&#xff0c;那么这时就有一个问题&#xff1a;既然 B 已经引入了 A 的…

【机器学习项目 心脏病预测】

文章目录心脏病预测导入数据集数据集介绍理解数据数据处理机器学习K近邻分类器逻辑回归支持向量分类器&#xff08;SVC&#xff09;决策树分类器随机森林分类器结论心脏病预测 在这个机器学习项目中&#xff0c;我们使用UCI心脏病数据集 UCI &#xff0c;并将使用机器学习方法…

【论文阅读 | arXiv 2025 | WaveMamba:面向RGB-红外目标检测的小波驱动Mamba融合方法】

论文阅读 | arXiv 2025 | WaveMamba&#xff1a;面向RGB-红外目标检测的小波驱动Mamba融合方法​​1&&2. 摘要&&引言3. 方法3.1. 预备知识3.2. WaveMamba3.3. WaveMamba融合块&#xff08;WMFB&#xff09;3.3.1. 低频Mamba融合块&#xff08;LMFB&#xff09;…

DevExpress发布PowerPoint Presentation API库,支持跨平台与 PDF 导出

DevExpress专注于为 .NET、JavaScript、VCL 等多种平台提供高性能 UI 控件、报表工具、数据可视化组件及开发框架&#xff0c;产品覆盖桌面、Web、移动及跨平台应用开发领域。凭借稳定的性能、丰富的功能与优质的技术支持&#xff0c;DevExpress 的解决方案已广泛应用于金融、制…

Vue3使用 DAG 图(AntV X6)

参考文档 AntV X6 文档 可自定义设置以下属性 容器宽度&#xff08;width&#xff09;&#xff0c;类型&#xff1a;number | string&#xff0c;默认 ‘100%’容器高度&#xff08;height&#xff09;&#xff0c;类型&#xff1a;number | string&#xff0c;默认 ‘100%’…