[剑指offer]面试题56:链表中环的入口结点

本文介绍了一种高效算法来解决链表中环的入口节点查找问题。通过两步走策略,首先找到环中任意一点,接着计算环的长度,最终确定环的入口节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead){
        // 1.先找到环中的一个节点
        // 2.记录环的长度
        // 3.指针先行,找到入口节点
        ListNode* oneNode = oneNodeInCycle(pHead);
        if(oneNode == NULL)
            return NULL;

        // 计算长度
        ListNode* walk = oneNode->next;
        int len = 1;
        while(oneNode != walk){
            ++len;
            walk = walk->next;
        }

        // 指针先行,找到入口节点
        ListNode* fast = pHead;
        ListNode* slow = pHead;
        while(len--){
            fast = fast->next;
        }

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

    // 返回环中的一个节点或NULL
    ListNode* oneNodeInCycle(ListNode* pHead){
        ListNode* fast = pHead;
        ListNode* slow = pHead;
        while(pHead && pHead->next && pHead->next->next){
            fast = fast->next->next;
            slow = slow->next;
            if(fast == slow)
                return fast;
        }
        return NULL;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值