题解 | #链表中环的入口结点#

链表中环的入口结点

https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4


/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
#include <cstdio>
class Solution {
  public:
    ListNode* FindCrossNode(ListNode* pHead)
    {
        if (pHead == nullptr) {
            return nullptr;
        }
        ListNode* pFast = pHead;
        ListNode* pSlow = pHead;
        while ((pFast != nullptr) && (pSlow != nullptr) && (pFast->next != nullptr)) {
            pFast = pFast->next->next;
            pSlow = pSlow->next;
            if (pFast == pSlow) {
                return pFast;
            }
        }
        return nullptr;

    }

    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        // 找汇合点
        if (pHead == nullptr) {
            return nullptr;
        }
        auto pCrossNode = FindCrossNode(pHead);
        if (pCrossNode == nullptr) {
            return nullptr;
        }
        // 从起始点到交汇点的距离是环长度的整数倍,即两个指针均单步遍历的话,
        // 从起始点到交汇点和从交汇点到交汇点可以相遇(环中可能已经走了若干圈),
        // 由于从入口点到交汇点之间是重合部分,则在入口点就是第一个相遇点
        
        while ((pHead != pCrossNode)) {
            pHead = pHead->next;
            pCrossNode = pCrossNode->next;
        }
        return pHead;
    }
};

在线编程练习 文章被收录于专栏

C++在线编程练习题解

全部评论

相关推荐

在投简历的柠檬精很想...:可以明确说,问的东西几乎是简历上的东西。你写的确实有点模糊。面试可能会问你一些常用的通信的问题,差分信号走线之类的,单片机最小系统啥的,模电,数电,基本电源,buck,boost,ldo之类的吧。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务