美文网首页
链表中环的入口结点

链表中环的入口结点

作者: su945 | 来源:发表于2020-05-01 14:48 被阅读0次

题目描述

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

问题分析

  • step1 判断是否有环
    采用快慢指针的模式,如果快指针和慢指针同时指向同一个地址,说明有环。此时的相遇点在环上。
  • step2 判断环的长度
    从相遇点出发,经过多少步再次指向相遇点,此时记录的步数即为环的长度
  • step3 找寻环的入口处
    从指针1和指针2表头出发,指针1先走环的长度,然后同时按相同的步数出发,当指针1和指针2相遇的位置即为环的入口处。

    解题思路1

/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:

    ListNode* MeetNode(ListNode* pHead)
    {
        if (pHead == nullptr)
        {
            return nullptr;
        }
        //ListNode* Node = NULL;
        ListNode* slowNode = pHead->next;
        if (slowNode  == nullptr)
        {
            return slowNode ;
        }
        ListNode* fastNode = slowNode->next;
        
        while (fastNode != nullptr && slowNode != nullptr)
        {
            if (fastNode == slowNode)
            {
                return slowNode;
            }
            //更新
            slowNode = slowNode->next;
            fastNode = fastNode->next;
            if (fastNode->next != nullptr)
            {
                fastNode = fastNode->next;
            }
        }
    }

    ListNode* EntryNodeOfLoop(ListNode* pHead)
    {
        //step1 判断是否有环
        ListNode* meetNode = MeetNode(pHead);
        if (meetNode == nullptr)
        {
            return nullptr;
        }
        //step2 判断环的长度
        ListNode* tmp = meetNode;
        int count = 1;
        while (tmp->next != meetNode)
        {
            tmp = tmp->next;
            count++;
        }

        //step3 找寻环的入口处
        ListNode* Node1 = pHead;
        ListNode* Node2 = pHead;
        for (int i = 0; i < count; ++i)
        {
            Node2 = Node2->next;
        }
        while (Node1 != Node2)
        {
            Node1 = Node1->next;
            Node2 = Node2->next;
        }
        return Node1;
    }
};

参考

https://github.com/WordZzzz/Note/commit/ad0df0a24ffcf94a5330b7a3574d76612381a8c0
https://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4?f=discussion

相关文章

  • 剑指offer.C++.code56-60

    56. 链表中环的入口结点 一个链表中包含环,请找出该链表的环的入口结点。 57. 删除链表中重复的结点【基于递归...

  • 链表

    合并排序链表 链表排序 链表中环的入口结点 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出nul...

  • [剑指offer] 链表

    链表中环的入口结点 题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 解题思路:...

  • JZ-055-链表中环的入口结点

    链表中环的入口结点 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。题目链接:...

  • 链表-链表中环的入口结点-java/c++

    链表中环的入口结点 题目描述 一个链表中包含环,请找出该链表的环的入口结点。 思路一: 用map或者set,遍历链...

  • 【链表】链表中环的入口结点

  • 链表中环的入口结点

    题目描述:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 思路:a、第一步,找环中相汇...

  • 链表中环的入口结点

    题目描述一个链表中包含环,请找出该链表的环的入口结点。

  • 链表中环的入口结点

    快慢指针f , s,两指针相遇时,f = 2* s, 设环长度为n,n = s再一个慢指针从链表头开始,两个慢指针...

  • 链表中环的入口结点

    给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 快慢指针,一个每次走一步,一个每次走两...

网友评论

      本文标题:链表中环的入口结点

      本文链接:https://www.haomeiwen.com/subject/bdhqghtx.html