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

目录

  • 题型三:链表相交,找相交节点
    • 思路解析
    • 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

密钥安全存储方案探讨与实践

随着信息技术的迅猛发展和应用范围的不断扩大,我们日常生活中的许多方面已经与信息技术密不可分。而在信息安全领域中,密钥的安全存储显得尤为重要。本文将探讨密钥安全存储的必要性、相关技术和实践方案,并提出一些解决方案。 一、密钥安全存…

Redis 常用的类型和 API

前言 在当今的软件开发中,数据存储与操作是至关重要的一部分。为了满足日益增长的数据需求和对性能的追求,出现了许多不同类型的数据库。其中,Redis 作为一种基于内存且高性能的键值存储数据库,因其快速的读取速度、丰富的数据结…

进行 “最佳价格查询器” 的开发(多种并行方式的性能比较)

前置条件 public class Shop {private final String name;private final Random random;public Shop(String name) {this.name name;random new Random(name.charAt(0) * name.charAt(1) * name.charAt(2));}public double getPrice(String product) {return calculatePrice…

第4关:非递归实现二叉树左右子树交换

任务描述相关知识 栈的基本操作二叉树后序遍历编程要求测试说明 任务描述 本关任务:给定一棵二叉树,使用非递归的方式实现二叉树左右子树交换,并输出后序遍历结果。 相关知识 为了完成本关任务,你需要掌握:1.栈的基…

PostGIS学习教程一:PostGIS介绍

一、什么是空间数据库 PostGIS是一个空间数据库,Oracle Spatial和SQL Server(2008和之后版本)也是空间数据库。 但是这意味着什么?是什么使普通数据库变成空间数据库? 简短的答案是… 空间数据库像存储和操作数据库中其他任何…

C语言文件操作 | 文件分类、文件打开与关闭、文件的读写、文件状态、文件删除与重命名、文件缓冲区

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

UI 自动化测试框架设计与 PageObject 改造!

在 UI 自动化测试过程中,面对复杂的业务场景,经常会遇到这样的挑战: 简单的录制/回放速度快,但无法适应复杂场景;编写自动化测试脚本比较灵活,但工作量大且可维护性差;以往的封装技术&#xff…

Metric

如果 Metric ‘use_polarity(使用极性)’ ,则图像中的对象必须和模型具有相同的对比度(Contrast)。比如,如果模型是一个在暗/深色背景上的明亮物体,则仅当对象比背景更亮时才会被找到。 如果 …

塑料质量检测是确保产品制造和装配过程的关键环节

激光塑料透光率检测是一种有效的塑料材料特性检测方法。在激光束通过上层透明材料后,被下层材料吸收。上层材料可以是透明的或者是有颜色的,但是必须能够保证有足够的激光通过。 塑料质量检测是确保产品制造和装配过程的关键环节。通过激光塑料透光率检测…

微博开启下一战:降本增效守利润,垂直内容拓营收

微博的商业想象空间正在逐步打开。 近日,微博披露了2023年三季度财报,营收4.422亿美元,同比下跌3%;调整后净利润1.366亿美元,同比增长17%。但若剔除汇率因素影响,微博的整体业绩仍然保持在正向增长轨道。 …

软考网络工程师知识点总结(二)

目录 21、海明码--差错控制 22、CRC循环冗余校验码 23、网络时延的计算 24、根据距离选择传输介质 25、多模光纤和单模光纤的区别 26、CSMA/CD协议 27、以太网帧结构 28、以太网类型及传输介质的选择 29、交换式以太网(交换机) 30、VLAN虚拟局…

【Python基础】网络编程之Epoll使用一(符实操:基于epoll实现的实时聊天室)

🌈欢迎来到Python专栏 🙋🏾‍♀️作者介绍:前PLA队员 目前是一名普通本科大三的软件工程专业学生 🌏IP坐标:湖北武汉 🍉 目前技术栈:C/C、Linux系统编程、计算机网络、数据结构、Mys…

wpf devexpress设置行和编辑器

如下教程示范如何计算行布局,特定的表格单元编辑器,和格式化显示值。这个教程基于前一个文章 选择行显示 GridControl为所有字段生成行和绑定数据源,如果AutoGenerateColumns 属性选择AddNew。添加行到GridControl精确显示为特别的几行设置。…

1688商品采集api接口1688代购商品采集API商品详情数据获取

做小程序商城时,最崩溃的瞬间是什么? 一定是当你有几百件商品,却要一件一件编辑商品名称、规格、上传图片吧…… 为了帮助商家快速上货开店,特意提供了1688的获取商品详情数据的接口,方便商家一键采集淘宝、天猫、京…

电动自动换刀高速电主轴的技术优势浅析

在制造业中,自动化技术的发展一直是一个重要的话题。其中,电动自动换刀被认为是一项高效、智能、先进的技术,在高速电主轴中使用电动自动换刀这一技术,不仅能够缩短换刀时间,还能减少换刀失误,本文将探讨Sy…

Leetcode-110 平衡二叉树

递归实现 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

“探寻服务器的无限潜能:从创意项目到在线社区,你会做什么?”

文章目录 每日一句正能量前言什么是服务器?服务器能做什么?服务器怎么用?部署创意项目,还是在线社区亦或做其他的?后记 每日一句正能量 未知的下一秒,千万不要轻言放弃。 前言 在数字化时代,服…

ctf之流量分析学习

链接:https://pan.baidu.com/s/1e3ZcfioIOmebbUs-xGRnUA?pwd9jmc 提取码:9jmc 前几道比较简单,是经常见、常考到的类型 1.pcap——zip里 流量分析里有压缩包 查字符串或者正则表达式,在包的最底层找到flag的相关内容 我们追踪…

【DP】背包问题全解

一.简介 DP(动态规划)背包问题是一个经典的组合优化问题,通常用来解决资源分配的问题,如货物装载、投资组合优化等。问题的核心思想是在有限的资源约束下,选择一组物品以最大化某种价值指标,通常是总价值或…

跨越编程界限:C++到JavaSE的平滑过渡

JDK安装 安装JDK 配置环境变量: Path 内添加 C:\Program Files\Java\jdk1.8.0_201\bin 添加 JAVA_HOME C:\Program Files\Java\jdk1.8.0_201 添加 CLASSPATH .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 第一个Java程序 HelloWorld.java public class…