【数据结构】链表OJ面试题4(题库+解析)

news2024/9/24 21:25:46

 1.前言 

前五题在这http://t.csdnimg.cn/UeggB

后三题在这http://t.csdnimg.cn/gbohQ

给定一个链表,判断链表中是否有环。http://t.csdnimg.cn/Rcdyc 

记录每天的刷题,继续坚持!

2.OJ题目训练

10. 给定一个链表,返回链表开始入环的第一个结点。 如果链表无环,则返回 NULL

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

本题是上一题(链接在上)的延续,不清楚的小码喵可以去上一篇博客观看一下。

方法一

思路

为了方便分析,我们把示例图简化一下涉及一点数学思维,大家做好准备。

我们依然按照上题来定义两个快慢指针,fast一次前进两步,slow一步

如果为环,那么fast和slow终会在环中相遇,这里假设已经相遇了。

注意以下的单位为节点数

入口点:链表开始入环的第一个节点

相遇点:fast和slow相遇的节点

假设起点到入口点长度:L
假设环的周长是:C
假设入口点到相遇点的长度是:X

由于fast走过的距离是链表起点>>入口点 + 在环中移动的圈数(必须转圈才能做到跟slow相遇)+ 入口点到相遇点的距离

slow是链表起点>>入口点 + 入口点到相遇点的距离

fast走的距离是slow的两倍,那么我们可以得出:

fast移动的距离:L+C+X

slow移动的距离:L+X

两倍关系:L+C+X=2(L+X)

但是上面fast公式的C我们要画上一个问号,因为fast可能在环中不止会转一圈,可能会转很多圈(环足够小),所以我们再改进公式得到:

fast移动的距离:L+n*C+X         n为fast在环中循环的圈数

slow移动的距离:L+X

两倍关系:L+n*C+X=2(L+X)

                

        L = n*C - X

得出关系:链表头走到起点的距离 = n倍的周长再减去相遇点到起点的距离

进而得出:一个指针从表头走,一个指针从相遇点走,那么他们会在入口点相遇!

附源代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *fast;
    struct ListNode *slow;
    fast = slow = head;
    while(fast&&fast->next&&slow->next)
    {
        fast=fast->next->next;
        slow=slow->next;
        if(fast == slow)    //相遇
        {
            struct ListNode *tou = fast;    //相遇点,相遇时再创建节约空间
            while(head!=tou)    //向下继续走,直到他们相遇就是起点
            {
                head = head ->next;
                tou = tou -> next;
            }
            return tou; 
        }
        
    }

    return NULL;    //无法相遇则不为环形链表
}

方法二

本题还有一个极为简单的解法,但是相对繁琐,我们要用到之前刷过的一题。(CV一下)

这里给大家一个链接看看大家能不能自己想出方法:160. 相交链表 - 力扣(LeetCode)

思路

我们可以利用更新奇的办法:分割链表,来把一个链表变为两个,再利用相交链表的方法来求出他们的起点。

当fast和slow相遇时,我们记录这个相遇点

之后再记录下一个点,我们就可以把相遇点断开,称为newhead

这样,环形链表,和newhead组成的表,就可以运用相交链表的方法,达到入口点既交点的节点了

如图,红色和紫色,既两个相交链表

注意事项

  • 相交链表那块要足够清楚,我们是将问题牵线搭桥到那里去的,所以要足够理解
  • 直接CV

附源代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

//返回相交链表相交节点的函数

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode *curA=headA;
    struct ListNode *curB=headB;
    int lenA=1,lenB=1;  //链表的长度至少为1
    while(curA->next)   //计算链表A的长度及尾节点
    {
        lenA++; //顺便计算表长
        curA=curA->next;
    }
    while(curB->next)
    {
        lenB++;
        curB=curB->next;
    }
    if(curA!=curB)
    {
        return NULL;    //两边的为节点不相同,那根本不是相交链表
    }

    int gap=abs(lenA-lenB); //abs为取绝对值
    struct ListNode *longlist=headA;    //假设A为长节点,这里我们利用替身来表示长表
    struct ListNode *shortlist=headB;   //就可以节省很多判断语句
    if(lenB>lenA)                       //若B长,侧替换
    {
        longlist=headB;
        shortlist=headA;
    }
    while(gap--)
    {
        longlist=longlist->next;    //先走差值步
    }
    while(longlist!=shortlist)  //不等于则同时向前遍历,直到相等
    {
        longlist=longlist->next;
        shortlist=shortlist->next;
    }
    return longlist;    //返回第一个相等值
}

//此题函数
struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *fast;
    struct ListNode *slow;
    fast = slow = head;
    while(fast&&fast->next&&slow->next)
    {
        fast=fast->next->next;
        slow=slow->next;
        if(fast == slow)    //相遇
        {
            struct ListNode *tou = fast;    //相遇点,相遇时再创建节约空间
            struct ListNode *newhead = tou->next; //新表头为相遇的下一个节点
            tou->next = NULL;   //将相遇点断开
            return getIntersectionNode(newhead, head);
        }
    }
    return NULL;    //无法相遇则不为环形链表
}

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

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

相关文章

Qt PCL学习(二):点云读取与保存

注意事项 版本一览:Qt 5.15.2 PCL 1.12.1 VTK 9.1.0前置内容:Qt PCL学习(一):环境搭建 0. 效果演示 1. pcl_open_save.pro QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgets// 添加下行代码&#…

外贸邮件群发如何做?外贸邮件群发靠谱吗?

外贸邮件群发有哪些平台?外贸群发邮件用什么邮箱? 外贸邮件群发是许多企业在开展国际贸易时常用的营销手段,它不仅能够快速地将产品信息和促销活动传达给目标客户,还能够有效地建立和维护客户关系。下面,就让蜂邮探讨…

yolov8自制数据训练集

目录 1.YOLOv8是啥 2.系统环境 3.安装labelimg 3.1安装 3.2启动 labelimg 4.自制分类图片 4.1 YOLO数据集要求 4.2 图片保存目录 4.3 利用labelimg进行标注 4.4 存储图片 4.5 标注文件 5.数据集训练 5.1yaml文件 5.2训练命令 5.3查看训练过程 5.3.1启动tensorb…

Python中使用opencv-python库进行颜色检测

Python中使用opencv-python库进行颜色检测 之前写过一篇VC中使用OpenCV进行颜色检测的博文,当然使用opencv-python库也可以实现。 在Python中使用opencv-python库进行颜色检测非常简单,首选读取一张彩色图像,并调用函数imgHSV cv2.cvtColor…

【若依】若依框架在本地运行的操作方法,及踩坑记录

若依框架简介 若依是一个Gitee上一个开源的基于SpringBoot开发的轻量级Java快速开发框架,用以快速构建后台管理系统,点击跳转到官方地址 本机部署过程 Step1. 下载项目源码 我选择的是直接下载zip压缩包,解压后得到如下文件夹&#xff0c…

初识 Protobuf 和 gRpc

初步了解 Protobuf 和 gRpc Protocol Buffers Protocol Buffers(又称protobuf)是谷歌的语言无关、平台无关、可扩展的机制,用于序列化结构化数据。您可以在protobuf的文档中了解更多关于它的信息。 ProtoBuf 的定义 ProtoBuf是将类的定义…

网神 SecGate 3600 防火墙 route_ispinfo_import_save 文件上传漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

sqli靶场完结篇!!!!

靶场,靶场,一个靶场打一天,又是和waf斗智斗勇的一天,waf我和你拼啦!! 31.多个)号 先是一套基本的判断 ,发现是字符型,然后发现好像他什么都不过滤?于是开始poc 3213131…

Pycharm中以chrome打开HTML文件报错: Windows找不到文件‘Chrome‘

随笔记录 目录 1. 问题描述 2. 定位问题 3. 解决方法 3.1 获取Chrome 安装路径 3.2 修改Pycharm 中Chrome的配置 4. 校验结果 1. 问题描述 Pycharm中以chrome打开HTML文件报错:Windows 找不到文件chrome如图所示: 2. 定位问题 因为Pycharm中未设…

spring boot打完jar包后使用命令行启动,提示xxx.jar 中没有主清单属性

在对springBoot接口中间件开发完毕后,本地启动没有任何问题,在使用package命令打包也没异常,打完包后使用命令行:java -jar xxx.jar启动发现报异常:xxx.jar 中没有主清单属性,具体解决方法如下:…

算法随想录第五十二天打卡|300.最长递增子序列 , 674. 最长连续递增序列 , 718. 最长重复子数组

300.最长递增子序列 今天开始正式子序列系列,本题是比较简单的,感受感受一下子序列题目的思路。 视频讲解:动态规划之子序列问题,元素不连续!| LeetCode:300.最长递增子序列_哔哩哔哩_bilibili 代码随想录…

c++二叉树寒假特训题目(1)答案你

大家好,我是周曦,今天给大家写了c二叉树寒假特训题目(1)的答案。 题目传送门 答案 二叉树存储 思路 存储部分可以用满二叉树的性质,设深度为k,那么一共有2的k次方减1个数,最多是1024个。计算与输出部分因为是满二…

跟着pink老师前端入门教程-day21+22

5.4 常见flex布局思路 5.5 背景线性渐变 语法: background: linear-gradient( 起始方向 , 颜色 1, 颜色 2, ...); background: -webkit-linear-gradient(left, red , blue); background: -webkit-linear-gradient(left top, red , blue); 背景渐变必须添加浏览…

vue项目打包部署到flask等后端服务里面,实现前后端不分离部署,解决空白页面和刷新页面not fount问题

1. 编译模式一定要设置为esnext,否则会报错: Strict MIME type checking is enforced for module scripts per HTML spec.Expected a JavaScript module script but the server responded with a MIME type of "text/plain". 具体解释可以看vi…

解决CORS错误(Spring Boot)

记录一下错误,以博客的形式 前言 跨域(Cross-Origin)是指在Web开发中,当一个Web应用试图从一个源(域名、协议、端口组合)获取资源时,该请求的目标与当前页面的源不同。具体来说,当一…

Docker容器监控-CIG

目录 一、CIG说明 1. CAdvisor 2. InfluxDB 3. Grafana 二、环境搭建 1. 创建目录 2. 编写 docker-compose.yml 3. 检查并运行容器 三、进行测试 1. 查看 influxdb 存储服务 是否能正常访问 2. 查看 cAdvisor 收集服务能否正常访问 3. 查看 grafana 展现服务&#…

Alt + TAB 禁止在 Edge 标签页之间切换

(原文:https://blog.iyatt.com/?p13587 ) 浏览器标签页之间切换可以用 {Ctrl}{Tab} 或者 {Ctrl}{数字}精准到标签页码,结果 Windows 11 默认把 Edge 标签页切换混入了 {Alt}{Tab} 前台应用窗口切换,经常不注意是在 Ed…

2.8作业

程序代码&#xff1a; CCgcc EXEhello OBJS$(patsubst %.c,%.o,$(wildcard *.c)) CFLAGS-c -oall:$(EXE)$(EXE):$(OBJS)$(CC) $^ -o $%.o:%.c$(CC) $(CFLAGS) $ $^.PHONY:cleanclean:rm $(OBJS) $(EXE) 程序代码&#xff1a; #include<stdio.h> #include<string.h&…

跨境电商新风潮:充分发挥海外云手机的威力

在互联网行业迅速发展的大环境下&#xff0c;跨境电商、海外社交媒体营销以及游戏产业等重要领域都越来越需要借助海外云手机的协助。 特别是在蓬勃发展的跨境电商领域&#xff0c;像亚马逊、速卖通、eBay等平台&#xff0c;结合社交电商营销和短视频内容成为最有效的流量来源。…

什么是美颜SDK?直播美颜SDK的技术原理与应用

当下&#xff0c;美颜SDK的崛起成为了直播美颜的关键推动力。今天&#xff0c;小编将为大家讲解美颜SDK的概念、技术原理以及在直播应用中的广泛应用。 一、什么是美颜SDK&#xff1f; 美颜SDK是一种软件开发工具包&#xff0c;旨在为应用开发者提供一整套美颜算法和功能&…