【数据结构】(牛客)链表的回文结构,LeetCode相交链表,LeetCode环形链表

news2024/12/23 17:18:56

目录

         一、链表的回文结构

             1、题目说明

             2、题目解析

         二、相交链表 

             1、题目说明

             2、题目解析

         三、环形链表

             1、题目说明

             2、题目解析


一、链表的回文结构

 1、题目说明

题目链接:链表的回文结构

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

 2、题目解析

首先找出链表的中间结点,再从中间节点开始将中间结点 mid 以及后续结点反转得到一个新链表rhead,然后对这两个链表进行比对,直到新链表为空时就判断停止,返回 true,若在循环判断中发现了结点数值不一样,则返回 false 。

如图所示:

class PalindromeList {
public:
    //寻找中间结点
    struct ListNode* middleNode(struct ListNode* head)
    {
        struct ListNode*slow ,*fast;
        slow = fast = head;
        while(fast && fast->next)
        {
            slow = slow->next;
            fast = fast->next->next;
        }
        return slow;
    }
    //从中间结点开始将后面的链表反转
    struct ListNode* reverseList(struct ListNode* head)
    {
        struct ListNode* cur = head;
        struct ListNode* rhead = NULL;
        while(cur)
        {
            struct ListNode* next = cur->next;
            //头插
            cur->next = rhead;
            rhead = cur;
            cur = next;
        }
        return rhead;
    }

    bool chkPalindrome(ListNode* A) {
        struct ListNode* mid = middleNode(A);
        struct ListNode* rhead = reverseList(mid);
        while(A && rhead)
        {
            if(A->val != rhead->val)
                return false;

            A = A->next;
            rhead = rhead->next;
        }
        return true;
    }
};

二、相交链表 

 1、题目说明 

题目链接:相交链表

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 NULL。 

 2、题目解析

这道题目其实也类似快慢指针的问题,

思路:

1、首先找出两个链表的尾结点,顺便记录链表的长度。

2、算出两个链表的长度差的绝对值(gap)。

3、较长的链表先走gap步。

4、最后两个链表同时走,找交点。

  

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
    struct ListNode* curA = headA;
    struct ListNode* curB = headB;
    int lenA = 0,lenB = 0;
    //找尾
    while(curA->next)
    {
        lenA++;
        curA = curA->next;
    }
    while(curB->next)
    {
        lenB++;
        curB = curB->next;
    }
    //尾结点不相等就不相交
    if(curA != curB)
        return NULL;
    
    int gap = abs(lenA - lenB);
    //假设A就是较长的链表,B是较短的链表
    struct ListNode* longList = headA,*shortList = headB;
    if(lenA < lenB)//如果假设错误,则反过来
    {
        longList = headB;
        shortList = headA;
    }
    //长的先走差距步
    while(gap--)
    {
        longList = longList->next;
    }
    //同时走,找交点
    while(longList != shortList)
    {
        longList = longList->next;
        shortList = shortList->next;
    }
    return longList;
}

三、环形链表

 1、题目说明

题目链接:环形链表

给你一个链表的头节点 head,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

 2、题目解析

思路:这道题用快慢指针,慢指针走一步,快指针走两步,如果链表带环的话,快指针一定会追上慢指针。

bool hasCycle(struct ListNode *head) 
{
    struct ListNode* fast = head,*slow = head;
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast)
            return true;
    }
    return false;
}


本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。 

 老铁们,记着点赞加关注!!! 

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

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

相关文章

RHCE-ssh服务设置

目录 要求&#xff1a; 1.两台机器&#xff1a;第一台机器作为客户端&#xff0c;第二台机器作为服务器&#xff0c;在第一台使用rhce用户免密登录第二台机器 2.禁止root用户远程登录和设置三个用户sshuser1, sshuser2, sshuser3 3&#xff0c; 只允许sshuser3登录&#xff…

Java开发入门到精通之Java的数据库访问

一、前言 在应用程序开发中&#xff0c;需要使用数据库管理和存储各种数据。在Java中&#xff0c;提供了一个JDBC技术(Java Database Connectivity&#xff0c;JDBC&#xff0c;Java数据库连接)&#xff0c;它的作用是连接数据库并访问。接下来小编带大家一起来学习JDBC技术! …

天猫汽车商详页的SSR改造实践

由于汽车业务的特殊性&#xff0c;天猫汽车基于 Rax 多页应用自建了商品详情的 H5 页面。自定义商详承载了众多业务能力和投放场景。随着业务的发展和页面承载内容的增多&#xff0c;开始出现白屏时间太长等体验问题。前端性能优化算是个老生常谈的问题&#xff0c;我们的页面已…

DBeaver安装教程

软件安装包官网地址https://dbeaver.io/但一般由于网络问题&#xff0c;我们是很慢才连接上&#xff0c;或者连接不上这里提供压缩包链接&#xff0c;解压可直接用&#xff0c;亲测链接&#xff1a;https://pan.baidu.com/s/14KGY0JakRTOHQVkiRUWc7g?pwdcxda 提取码&#xff1…

2022年第十二届APMCM亚太杯1月增赛E题思路分享

2022年亚洲及太平洋地区建模数学竞赛问题E 有多少颗核弹可以摧毁地球? 题目回顾&#xff1a; 1.基本数据分析 a) 哪些国家曾经拥有过核武器? b) 在过去的20年中&#xff0c;哪个国家的核武器库存减少或增加得最多? c) 在哪五年早&#xff0c;核武器试验发生的次数最多…

【笔记:模拟CMOS集成电路】噪声——分析基础(1)

【笔记&#xff1a;模拟CMOS集成电路】噪声——分析基础&#xff08;1&#xff09;前言1噪声的定义2噪声的描述2.1统计特性&#xff08;1&#xff09;平均功率&#xff08;2&#xff09;功率谱密度&#xff08;PSD&#xff09;2.2噪声相关指标&#xff08;1&#xff09;SNR&…

【C++】vector用法简单模拟实现

文章目录1.vector的介绍及使用1.1 vector基本概念1.2 vector的使用1.2.1 vector的定义 (构造函数)1.2.2 vector的迭代器使用1.2.3 vector 增删查改1.2.4 vector 迭代器失效问题&#xff08;重点&#xff09;1.2.5 vector 空间增长问题2. vector的模拟实现2.1 SGI版vector实现示…

Logback的使用

文章目录概述使用配置文件详解<appender>ConsoleAppenderFileAppenderRollingFileAppender滚动策略<root><encoder>日志级别概述 Logback是一个实现了Slf4j 规范的实现框架&#xff0c;log4j的作者实现了Logback。 下面这是Logback官网的介绍&#xff1a; …

排序算法之插入排序

目录 排序算法介绍 插入排序 算法流程 算法实现 python C 插入排序与冒泡排序 排序算法介绍 《Hello算法》是GitHub上一个开源书籍&#xff0c;对新手友好&#xff0c;有大量的动态图&#xff0c;很适合算法初学者自主学习入门。而我则是正式学习算法&#xff0c;以这本…

云原生丨DBSwitch数据迁移实践

文章目录一、前言一、部署1. 环境准备2. 安装包部署二、使用1.登录2. 使用步骤-gauss迁移到gauss3. 使用步骤-MySQL迁移到gauss三、postgres和 gauss差异说明一、前言 DBSwitch是一个异构数据库迁移工具&#xff0c;能够提供源端数据库向目的端数据库的批量迁移同步功能&#…

Spring的体系结构介绍

Spring框架采用的是分层架构&#xff0c;它一系列的功能要素被分成20个模块&#xff0c;这些模块大体分为Core Container、Data Access/Integration、Web、AOP(Aspect Oriented Programming)、Instrumentation、Messaging和Test。 上图中&#xff0c;包含了Spring框架的所有模…

windows 安装docker使用教程

一、win10上安装docker注册docker账号配置虚拟化启用 bios 虚拟化&#xff0c;是否已启用可以通过任务管理器查看如果没有启动请看&#xff0c;否则可以直接跳到2开启 Hyper-V进行后续操作&#xff1a;irtualization Technology(VT)&#xff0c;中文译为虚拟化技术&#xff0c;…

LabVIEW拓扑

LabVIEW拓扑交换机拓扑是交换机模块上通道和继电器的组织表示形式。拓扑通常显示模块上继电器的默认连接&#xff0c;并标记通道名称。某些交换机模块可以使用多个拓扑或拓扑的变体。某些接线端子或附件可能会强制交换机模块使用给定的拓扑或拓扑集。NI-开关 支持 以下 拓扑&am…

009-Ensp-实验-VLAN间互联

实验要求 实现两台不同vlan的设备可以互联 实验结构 实验步骤 1. PC1 /PC2 配置ip /gateway 2. LSW4 新增两个VLAN e0/0/2 - e0/0/3 设置为access类型 加入到不同的vlan e0/0/1 设置为trunk类型 允许所有tag经过 3. LSW3 新增两个VLAN g0/0/1 设置为trunk 允许所有tag经过…

Http Https TCP/IP理解

一、 TCP Http Https UDP IP 介绍TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;传输控制协议/网际协议&#xff09;是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议&#xff0c;而是指一个由FTP、SM…

[数据结构基础]树和二叉树的概念、结构及性质

目录 一. 树 1.1 树的概念及结构 1.2 树和树的节点的相关概念 1.3 定义树的四种方式 1.3.1 说明了树的度为N 1.3.2 采用顺序表的方式存储子节点 1.3.3 采用结构体数组进行存储 1.3.4 左孩子右兄弟表示法&#xff08;最优&#xff09; 二. 二叉树 2.1 二叉树的概念及结…

完爆90%的性能毛病,数据库优化八大通用绝招

毫不夸张的说咱们后端工程师&#xff0c;无论在哪家公司&#xff0c;呆在哪个团队&#xff0c;做哪个系统&#xff0c;遇到的第一个让人头疼的问题绝对是数据库性能问题。如果我们有一套成熟的方法论&#xff0c;能让大家快速、准确的去选择出合适的优化方案&#xff0c;我相信…

9.JS-作用域-预解析

1.作用域 代码名字&#xff08;变量&#xff09;在某个范围内起作用和效果&#xff0c;目的是为了提高程序的可靠性&#xff0c;减少命名冲突 2.js作用域的分类&#xff08;es6之前&#xff09; 全局作用域和局部作用域 全局作用域&#xff1a;整个script标签或者是一个单独…

【数据结构与算法——C语言版】2. 数组

前言 本篇文章介绍了数组的基础定义及使用&#xff0c;并针对数组的基本增删改查做了一些代码示例&#xff0c;下篇文章将讲解基于数组的更高效的方法&#xff0c;比如二分查找、插入排序等。 数组基础 数组定义 int nums[10] {0};如上&#xff0c;定义一个int类型的数组&…

【Python百日进阶-数据分析】Day146 - plotly小提琴图:px.violin()/go.violin()

文章目录四、实例4.1 Plotly Express 的小提琴图4.1.1 Plotly Express 的基本小提琴图4.1.2 带框和数据点的小提琴图4.1.3 多个小提琴图4.1.4 叠加的小提琴图4.2 graph_objects的小提琴图4.2.1 基本小提琴图4.2.2 多条小提琴迹线4.2.3 分组小提琴图4.2.4 分裂小提琴图4.2.5 高级…