环形链表和相交链表OJ题

news2024/11/28 0:53:29

环形链表和相交链表OJ题

在这里插入图片描述

这篇博客详细讲解了环形数组和相交数组的问题

文章目录

  • 环形链表和相交链表OJ题
    • 一、环形链表
      • e.g.1
      • e.g.2
    • 二、相交链表

一、环形链表

环形列表是指尾结点next不指向NULL了,而是指向包括自己的前面任意一个结点。

e.g.1

题目及要求:
在这里插入图片描述
在这里插入图片描述
样例:
在这里插入图片描述
分析:
在这里插入图片描述
1.正常如果在找尾过程中,尾结点的下一个结点就是NULL,而环形链表则不是这样,所以我们可以通过这个条件来做一个初步的判断。
2.我们还是可以用快慢指针的思想(这个很重要,在很多找特定位置结点的题都可以用到这个思想),一个快指针和一个慢指针,如果相遇了,那就说明链表是一个循环的。快的可以给慢的扣圈。

代码实现:

bool hasCycle(struct ListNode *head) {
    struct ListNode* fast = head, *slow = head;
    while (fast && fast->next)//奇偶结点不同,判断条件不同
    {
        fast = fast->next->next;//快指针,后续会解释为什么用2倍速
        slow = slow->next;
        if (fast == slow)//相遇
        {
            return true;
        }
    }
    return false;
}

e.g.2

题目及要求:
在这里插入图片描述
在这里插入图片描述

样例:
在这里插入图片描述
分析:
在这里插入图片描述
结论:一个指针从起点,另一个指针从相遇点,他们同时出发,会在第一个进入循环的结点处相遇。
代码实现:

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode* fast = head, *slow = head;
    while (fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
        if (fast == slow)
        {
            struct ListNode* meet = slow;
            while (meet != head)
            {
                head= head->next;
                meet = meet->next;
            }
            return head;
        }
    }
    return NULL;
}

二、相交链表

题目及要求:
在这里插入图片描述
在这里插入图片描述

样例:
在这里插入图片描述

在这里插入图片描述
分析:
只能Y型相交,不能X型,因为一个结点向后只能存储一个地址,所以用了一个之后,后面就都是共同的结点了。
首先,我们可以考虑用A的第一个结点去和B里面每一个结点的地址比较,切记不能比结构体里的数值,因为数值可以相等。再用第二个去比,持续循环,这样最差的情况就是都找一遍还没找到,时间复杂度O(n ^ 2)。

其次,我们想一点时间复杂度更低的方式,可以找到他们等长位置的结点,一起向后走就可以了,其实这里也用到了快慢指针的思想,快慢指针就是利用中间的差值,而我们是为了将差值消掉。
代码实现:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode* tailA = headA, *tailB = headB;
    int countA = 0, countB = 0;
    while (tailA->next)//既通过找到尾结点判断两个链表的尾结点是否相等
    //来判断是否相交,也能算出长度,为后续磨平长度差做铺。
    {
        tailA = tailA->next;
        countA++;
    }
    while (tailB->next)
    {
        tailB = tailB->next;
        countB++;
    }
    if (tailA != tailB)
    {
        return NULL;
    }
    else
    {
        int n = abs(countA - countB);//无论差值正负,abs都变成正数差值
        struct ListNode* longList = headA, *shortList = headB;
        if (countA < countB)
        {
            longList = headB, shortList = headA;
        }
        while (n--)//循环n次,while(--n)循环(n - 1)次
        {
            longList = longList->next;
        }
        while (longList != shortList)
        {
            longList = longList->next;
            shortList = shortList->next;
        }
        return longList;
    }
}

如果对大家有帮助的话,希望大家多多点赞关注呀!
如果文章里有什么问题,也希望大家可以为我指出,谢谢大家!

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

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

相关文章

❤️ React的安装和使用(实战篇)

React的安装和使用 一、React的安装和使用 reactJs警告提示&#xff1a; This version of tar is no longer supported, and will not receive security updates. Please upgrade asap 翻译&#xff1a;tar2.2.2&#xff1a;此版本的tar不再受支持&#xff0c;将不会收到安全…

SwiftUI Swift 多个 sheet

今天做一个多个 sheet 的效果&#xff0c;点击下面三个按钮打开不同的 sheet 。 Show me the code import SwiftUIenum CurrentActiveSheet: Identifiable {case add, edit, deletevar id: Int {hashValue} }struct MoreSheet: View {State var currentActiveSheet: CurrentAc…

拓扑排序(Java实现)

一、基本思想 拓扑排序是一种对有向无环图&#xff08;DAG&#xff09;进行排序的算法&#xff0c;它将所有顶点排成一个线性序列&#xff0c;使得对于任意一条有向边&#xff08;u, v&#xff09;&#xff0c;u在序列中都出现在v之前。拓扑排序的思想非常直观&#xff0c;就像…

已完结,给小白的《50讲Python自动化办公》

大家好&#xff0c;这里是程序员晚枫&#xff0c;小红薯也叫这个名。 写在前面 上个周末去成都参加了第8届中国开源年会&#xff0c;认识了很多行业前辈和优秀的同龄人。 我发现在工作之外还能有一番事业的人&#xff0c;都有一个让我羡慕的共同点&#xff1a;有一个拿得出手…

Redis实战 | 使用Redis 的有序集合(Sorted Set)实现排行榜功能,和Spring Boot集成

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

LangChain+LLM实战---ChatGPT的工作原理

一个词一个词的输出 ChatGPT能够自动生成类似于人类书写的文本&#xff0c;这是非常了不起和出乎意料的。但它是如何做到的&#xff1f;为什么会有效果呢&#xff1f;我的目的在于大致概述ChatGPT内部发生了什么&#xff0c;然后探讨它为什么能够很好地生成我们认为有意义的文…

[MRCTF2020]你传你呢1

提示 只对php以及phtml文件之类的做了防护content-type.htaccess文件 这里就不整那么麻烦直接抓包测试 首先对后缀测试看过滤了哪些 (php php3 pht php5 phtml phps) 全部被ban了 到这里的后续思路通过上传一些配置文件把上传的图片都以php文件执行 尝试上传图片码, 直接上传成…

[自动化运维工具] Ansible的简单介绍与常用模块详解

文章目录 1. Ansible概述1.1 简介1.2 Ansible的特性1.3 Ansible的组件构成1.4 Ansible的工作原理 2. Ansible环境部署2.1 前置准备2.2 安装ansible2.3 查看基本信息2.4 配置远程主机清单 3. Ansible的常用模块3.1 ansible的基础命令格式3.2 Command模块3.2.1 基本格式和常用参数…

Android 10.0 系统wifi列表显示已连接但无法访问网络问题解决

1.前言 在10.0的系统产品开发中,在wifi模块也很重要,但是在某些情况下对于一些wifi连接成功后,确显示已连接成功,但是无法访问互联网 的情况,所以实际上这时可以正常上网的,就是显示的不正常,所以就需要分析连接流程然后解决问题 如图所示 2.系统wifi列表显示已连接但无…

前端滚动分页

场景 在前端开发中&#xff0c;我们经常碰到分页加载的需求&#xff0c;在PC端通常用分页组件就可以解决这种类型的场景。而当我们在移动端中&#xff0c;分页组件就显得有点不符合逻辑和正常的交互体验&#xff0c;所以滚动分页常常成为我们的一种选择&#xff0c;即页面滚动…

PostgreSQL空间地理信息postGis

PostgreSQL 数据库 PostgreSQL有各种各样的插件扩展其功能&#xff0c;其中地理信息有PostGis插件的支持&#xff0c;丰富PostgreSQL 数据库的使用功能。因此PostgreSQL 结合PostGis可以存储Geometry类型数据的点、线、面等数据&#xff0c;同时还可以结合相应的专有函数做空间…

听GPT 讲Rust源代码--library/std(11)

题图来自 Features of Rust[1] File: rust/library/std/src/sys/itron/time.rs 在Rust源代码中&#xff0c;rust/library/std/src/sys/itron/time.rs文件是用于实现与ITRON操作系统相关的时间功能。ITRON是一种实时操作系统&#xff0c;被广泛用于嵌入式系统中。这个文件中定义…

ps5计时计费管理系统软件怎么使用教学,佳易王PS5体验馆计时收费管理倒计时提醒软件试用下载

ps5计时计费管理系统软件怎么使用教学&#xff0c;佳易王PS5体验馆计时收费管理倒计时提醒软件试用下载 每台机子可以自由设置倒计时提醒的时间&#xff0c;到了时间后&#xff0c;电脑会发出语音提醒同时改变颜色双重提醒方式。也可以在中途关闭提醒或更改提醒时间。每个机子可…

Pycharm安装配置Pyqt5教程(保姆级)

目录 一、前言 1、依赖包 2、工具 二、安装依赖包 三、配置环境 四、配置设计工具 1、Qt Designer 2、PyRcc 3、PyUIC 五、使用 1、界面设计 2、ui文件转化为py文件 一、前言 很多情况下需要为程序设计一个GUI界面&#xff0c;在Python中使用较多的用户界面设计工具…

图像新型拼接

道路摄像头拼接 拼接道路上的摄像头&#xff0c;比较麻烦&#xff0c;如图所示 前后的摄像头都是如此&#xff0c;那么如何拼接摄像头画面呢&#xff0c;像下面这样拼接 测试代码 测试一下代码&#xff0c;使用python import cv2 import numpy as npimg cv2.imread("…

python 成绩统计,输出及格率和优秀率

题目描述&#xff1a; 小蓝给学生们组织了一场考试&#xff0c;卷面总分为100分&#xff0c;每个学生的得分都是一个0到100的整数。 如果得分至少是60分&#xff0c;则称为及格。如果得分至少为85分&#xff0c;则称为优秀。 请计算及格率和优秀率&#xff0c;用百分数表示&am…

【算法训练营】最近公共祖先+求最大连续bit数

算法 1.最近公共祖先求最大连续bit数 1.最近公共祖先 题目链接 【题目解析】&#xff1a; 最近公共祖先表示距离两个节点最近的公共父节点&#xff0c;这道题考察二叉树。【解题思路】&#xff1a; 题目所描述的满二叉树如下&#xff1a; 1 / \ 2 3 / \ / \ 4 5 6 7 上述树中…

分布式单元化

一 分布式单元化 1.1 两地三中心 顾名思义&#xff0c;两地指的是两个城市&#xff1a;同城&#xff0c;异地。三中心指的是三个数据中心&#xff1a;生产中心、同城容灾中心、异地容灾中心。 在同一个城市或者临近的城市建设两个相同的系统&#xff0c;双中心具备相当的业…

25.3 MySQL 多表查询

1. 排序 ORDER BY子句用于对查询结果进行排序. 它可以按照一个或多个列的值进行升序或降序排序.在SELECT语句中, ORDER BY子句应该位于结尾, 其基本语法如下: SELECT 字段1, 字段2, ... FROM 表名 ORDER BY 列名1 [ASC|DESC], 列名2 [ASC|DESC], ...其中, ASC(ascend): 表…

ardupilot开发 --- gdb 篇

环境 win11 vscode 1.81.0 wsl2 ardupilot 利用gdb工具在vsCode中实现 Ardupilot SITL的断点调试 优点&#xff1a;可在vsCode中实现断点调试。 参考文献&#xff1a;https://ardupilot.org/dev/docs/debugging-with-gdb-using-vscode.html 安装gdb工具 打开wsl&#xff0…