【数据结构】链表经典OJ题,常见几类题型(二)

news2025/3/9 10:07:04

目录

  • 题型三:链表相交,找相交节点
    • 思路解析
    • OJ题实例
    • 解题代码
  • 题型四:链表带环,找入环节点
    • 思路解析
    • OJ实例
    • 解题代码

题型三:链表相交,找相交节点

思路解析

看到这类题型首先要判断链表是否相交,而相交条件:两链尾部节点相同(地址相同,val值相同,next相同)。这样我们便可找到两链表的尾节点并判断这两个节点地址是否相同,若相同则两链表相交。上面这种情况两链表呈'Y'型,那么我们想一下两链表相交是否可以呈'X'型呢?
在这里插入图片描述
如上图所示如果两链表相交呈'X'型的话,相交节点的next就会指向两个节点,这并不符合单链表的定义。
那么在判断了相交链表后,如何找到相交节点呢?在我们找尾节点时,我们可以顺便计算两链表的长度,定义两链表指针slowfast分别指向链表头节点,让指向长链表的指针先走两链表长度的差值,然后一起向后走,当slow == fast时就找到了相交节点。

OJ题实例

LeetCode链接: 160. 相交链表

解题代码

//方法一的解法
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
    struct ListNode* cur1 = headA, *cur2 = headB;
    int len1 = 1, len2 = 1;
    //找尾节点,并计算链表长度
    while(cur1 -> next)
    {
        cur1 = cur1->next;
        len1++;
    }
    while(cur2 -> next)
    {
        cur2 = cur2->next;
        len2++;
    }
    if(cur1 != cur2)
        return NULL;
    //计算链表长度差值
    int count = abs(len1 - len2);
    struct ListNode* slow=headA, *fast=headB;
    if(len1 > len2)
    {
        fast = headA;
        slow = headB;
    }
    //找相交节点
    while(count--)
        fast = fast->next;
    while(slow != fast)
    {
        slow = slow->next;
        fast = fast->next;
    }
    return slow;
}

题型四:链表带环,找入环节点

思路解析

解决这题我们还是要先定义快慢指针slowfast,即当slow向后走一步,fast向后走两步。我们便可写一个结束条件为fast && fast->next的循环。因为如果此链表不带环,那么指针迟早会走到NULL;如果链表带环,那么便没有空节点,此循环便不会结束。这时我们只需要在slow == fast时结束循环,因为只有环形结构slow才能追上fast,则链表带环且这点在环内为相遇点。
对于找入环的第一个节点,我们可以先假设C环长L环外面部分长X入环点到相遇节点的长n为两指针相遇时fastslow多走的圈数,此处长皆为节点数,那么我们便可得到如下图所示的结构图:
在这里插入图片描述
接下来我将以两种方法解决此问题:

方法一:
我们可以想到当两节点相遇时,慢指针slow走过了L + X的距离,快指针fast走过了L + nC + X距离,又因为快指针的速度是慢指针的2倍,于是我们得到了一个数学公式,即:2(L + X) = L + nC + X,经过化简最后得到L = nC - X。此时我们可以定义两个结构体指针headmeet让他们分别从链表头节点和相遇节点向后走,根据此公式他们会在入环的第一节点相遇,于是就找到了入环第一个节点。

方法二:
我们可以在相遇点处将链表切断,然后经过反转链表的到'Y',于是乎这题就转变为了题型三的类型,即相交链表找第一个相交节点,如下所示:
在这里插入图片描述
两点需要注意:

  1. 如图中1处,我们是将L + X的部分反转;
  2. 如图中2处,最后需要将指向原头位置的指针指向NULL

OJ实例

LeetCode链接: 142. 环形链表 II

解题代码

//基于方法一的解法:
struct ListNode *detectCycle(struct ListNode *head)
{
   struct ListNode* slow = head, *fast = head;
   //判断fast和slow相遇的地方
   while(fast && fast->next)
   {
       slow = slow->next;
       fast = fast->next->next;
       if(fast == slow)
           break;
   }
   if(fast == NULL || fast -> next == NULL)
       return NULL;
    struct ListNode* meet = slow;
    //2(L+X) = L+nC+X
    //L+X=nC(C为环长,L为环外面部分长,X为进环点到相遇点的距离)
    while(meet != head)
    {
        meet = meet->next;
        head = head->next;
    }
    return meet;
}

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

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

相关文章

2022年06月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 Python中 print(“八进制{: o}”.format(12)) 正确的输出结果是?( ) A: 八进制:O B: 八进制:O14 C: 八进制14O D: 八进制14 答案:D 字符串的format()格式。 第2题 下列的程…

微服务拆分的一些基本原则

文章首发公众号:海天二路搬砖工 单一职责原则 什么是单一职责原则 单一职责原则原本是面向对象设计中的一个基本原则,它指的是一个类只负责一项职责,不要存在多于一个导致类变更的原因。 在微服务架构中,一个微服务也应该只负…

纯c语言模拟栈(初学必看)

1.栈的概念及其结构 栈是一种特殊的线性表,在栈这个结构里,越先存进去的数据越难取出来。 这个结构就像是一个只有一端有打开的容器,越先放进去的球越在底部,想要把底部的球拿出来,就必须先把前面的求拿出来。像这种”…

AYIT-ACM实验室发展历程

AYIT-ACM简介 ACM协会为你的梦想插上翅膀。 本院ACM协会成立于2012年 2008年开始小规模参加河南省竞赛 2014年成功实现金牌零突破 指导老师:孙高飞老师 安阳工学院计算机科学与信息工程学院ACM队是一支优秀的队伍,一支充满活力与激情的队伍&am…

vivado产生报告阅读分析-常规报告1

“ Report Utilization ” ( 使用率报告 ) 报告有助于从层级、用户定义的 Pblock 或 SLR 层面来分析含不同资源的设计的使用率。在流程中各步骤间使用 report_utilization Tcl 命令生成“ Utilization Report ”。 以下显示的报告详细信息适用于 Ultr…

【FPGA】十进制计数器 | 实现 4-bit 2421 十进制计数器 | 有限状态机(FSM)

目录 Ⅰ. 实践说明 0x00 十进制计数器 0x01 有限状态机(FSM) Ⅱ. 实践部分 0x00 4-bit 2421 十进制计数器 Ⅰ. 实践说明 0x00 十进制计数器 十进制计数器是一种以十进制运算的计数器,从 0 数到 9,然后返回 0 状态。由于它需…

【C语言数据结构————————二叉树】

文章目录 文章目录 一、什么是树 树的定义 树的种类 树的深度 树的基本术语 二、满二叉树 定义 满二叉树的特点 三、完全二叉树 定义 特点 四、二叉树的性质 五、二叉树的存储结构 顺序存储结构 链式存储结构 六、二叉树的基本操作 七、二叉树的创建 八、二叉树…

Vue3 ref函数和active函数

一、ref函数 我们在setup函数中导出的属性和方法虽然能够在模板上展示出来,但是并没有给属性添加响应式,因此,我们需要使用ref函数来为我们的数据提供响应式。 (一)引入ref函数 import { ref } from "vue"…

pychon/PIL/opencv/json学习过程中遇到的问题

1. 使用PIL.Image读取图片 注意:pytorch中对图像预处理是transforms的输入必须是PIL格式的文件,使用cv2读取的图片就按照第二条的代码处理(3通道合并、归一化处理) from PIL import Image img Image.open("test1.jpg"…

计算机组成原理之概述

概述 计组主要讲的是计算机的硬件实现方式。 机器字长 比如8080处理器,如果想处理16位数的整数运算,就需要执行两次。 可见,机器字长会影响到数据的处理速度。 计算机硬件的基本组成 早期的冯诺依曼机 冯诺依曼提出了“存储程序”的概念&…

【数据分享】2021-2023年我国主要城市逐月轨道交通运营数据

以地铁为代表的轨道交通是大城市居民的主要交通出行方式之一,轨道交通的建设和运营情况也是一个城市发展水平的重要体现。本次我们为大家带来的是2021-2023年我国主要城市的逐月的轨道交通运营数据! 数据指标包括:运营线路条数(条…

网络编程 初探windows编程

目录 一、什么是Winodws编程 二、开发环境搭建以及如何学习 三、VA助手安装 四、第一个Win32程序 五、窗口类句柄/窗口类对象 六、Winodws消息循环机制 七、Windows数据类型 一、什么是Winodws编程 Windows 编程指的是在 Microsoft Windows 操作系统上进行软件开发的过…

答题猜歌闯关流量主小程序开发

视频互动答题是一款微信小程序游戏,以视频互动的形式进行答题,内容涵盖广泛,包括天文地理、生活百科、历史文化、综艺娱乐、数理知识等。 用户可以通过答题获得红包兑换余额,并有机会赢得豪华奖品。 设计风格:设计风格…

Halcon 练习(1):模板匹配

文章目录 前言相关视频链接模板匹配介绍Halcon平台使用动态区域截取代码优化固定选取位置添加打印信息添加匹配个数 个人能力不足 前言 Halcon平台的使用需要学习新的知识,这里专门开个新的专栏用来练习Halcon平台使用。 相关视频链接 WPF/HALCON机器视觉合集 模板…

基于51单片机DS18B20温度检测报警系统串口设置阀值-仿真及源程序

一、系统方案 1、本设计采用51单片机作为主控器。 2、DS18B20采集温度值送到数码管显示。 3、按键报警阀值或串口设置阀值。 4、测量温度小于下限或大于上限,蜂鸣器报警。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 uint z; …

MFC 简单绘图与文本编辑

目录 一.创建单文档项目 二.消息映射机制 三.WM_PAINT消息触发 四.CVIEW类 五.设备上下文 六.资源类和资源的关系 七.画线,矩形 八.画布 九.画笔 十.画刷 十一.利用TRACE打印日志 十二.文本编程 十三.ID号 十四.菜单栏 十五.菜单命令路由 十六.工具…

金蝶云星空将子窗体的内容传回到父窗体的开发实现

文章目录 金蝶云星空将子窗体的内容传回到父窗体的开发实现前置任务父窗体打开子窗体时传入回调函数子窗体设置返回参数父窗体接收参数在回调函数根据参数做一些逻辑处理 金蝶云星空将子窗体的内容传回到父窗体的开发实现 前置任务 金蝶云星空表单插件实现父窗体打开子窗体&a…

网络安全黑客技术自学

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防…

pytorch框架学习(tensorboard的使用)

什么是tensorboard? tensorboard是一个可视化工具,它可以把训练过程中的数据变化以图像的形式绘制出来,或者记录训练过程中使用的图片 tensorboard的安装: 在pycharm的终端中输出安装命令后自动安装—— pip install tensorbo…

BlendTree动画混合算法详解

【混合本质】 如果了解骨骼动画就知道,某一时刻角色的Pose是通过两个邻近关键帧依次对所有骨骼插值而来,换句话说就是由两个关键帧混合而来。 那么可不可以由多个关键帧混合而来呢?当然可以。 更多的关键帧可以来自不同的动画片段&#xf…