【数据结构】[环形链表](LeetCode142. 环形链表 II)给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

2023-11-04

一.问题描述

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

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

不允许修改 链表。

二.思路分析

1.判断链表有环

(1)思路

 注意:如果fast一次走3步,slow一次走1步(即fast和slow一次走的步数相差2),则fast和slow有可能相遇,也有可能永不相遇。

当slow走到fast前面一个位置时,此时如果fast和slow相差的距离为偶数(即环的长度-1为偶数),则fast和slow永不相遇。

(2)代码

 struct ListNode {
     int val;
     struct ListNode *next;
 };

struct ListNode *detectCycle(struct ListNode *head)
{
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    int flag = 0;

    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;

        if(fast == slow)
        {
            flag = 1;
            break;
        }
    }

    if(flag == 0)
    {
        return NULL;
    }

2.找到入环的结点

(1)思路

证明

 

(2)代码

    while(fast != head)
    {
        head = head->next;
        fast = fast->next;
    }
    if(fast == head)
    {
        return head;
    }

 三.完整代码


struct ListNode 
{
    int val;
    struct ListNode *next;
};

struct ListNode *detectCycle(struct ListNode *head)
{
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    int flag = 0;

    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;

        if(fast == slow)
        {
            flag = 1;
            break;
        }
    }

    if(flag == 0)
    {
        return NULL;
    }

    while(fast != head)
    {
        head = head->next;
        fast = fast->next;
    }
    if(fast == head)
    {
        return head;
    }
    return NULL;
    
}

四.提交结果

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据结构】[环形链表](LeetCode142. 环形链表 II)给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null 的相关文章

  • python字符串替换空格_Python去除、替换字符串空格的处理方法

    个人想到的解决方法有两种 一种是 replace old new 第一个参数是需要换掉的内容比如空格 第二个是替换成的内容 可以把字符串中的空格全部替换掉 第二种方法是像这样 str 1 data a b c str 2 list str
  • 用海伦公式求三角形周长与面积 C++

    海伦公式又译作希伦公式 海龙公式 希罗公式 海伦 秦九韶公式 它是利用三角形的三条边的边长直接求三角形面积的公式 表达式为 S p p a p b p c 其中p等于周长的一半 给出平面坐标上不在一条直线上三个点坐标 x1 y1 x2 y2
  • Netty (3)-ByteBuf、池、直接内存、16进制

    传统IO在收发数据时 会阻塞当前线程 一边接收数据 一边对数据进行处理 处理完一段数据再继续接收下一段 再处理 而NIO会一次性将接收的所有数据 放入内存 处理数据时只需要读取内存 而IO线程被完全释放 这就是非阻塞 而被放入内存的数据在
  • 最通透的KMP算法详解

    前言 以前自己写一个字符串匹配或者主串中查找子串的程序时 都是用一个指针指向主串 另一个指针指向子串 然后两指针按字母逐一比较 看着自己写的代码运行一切正常时还沾沾自喜 现在想来 虽然这种方法也行的通 但是当字符串足够长时 效率会很低 自从
  • ubuntu下安装apache2.2+mod_wsgi+django(一)

    http blog csdn net huangxiansheng1980 article details 7202319 为了让apache或者nginx或者lighthttpd支持python可以用mod python的方式 但是由于m
  • C++数据结构笔记(9)树与二叉树的基本概念

    1 只有一个结点也可以称为树 只不过没有叶子结点 也可以有0个结点 称为空树 2 树具有递归性 树中还有树 3 结点的度 结点所拥有的子树的个数 4 树的高度 树的子树的最高层数 5 树的广义表示法 软件学院 软件开发 移动互联 大数据 人

随机推荐