剑指offer-面试题 23:链表中环的入口结点

博客围绕链表问题展开,给定一个链表,需判断其是否包含环,若包含则输出环的入口节点,若不包含则输出特定结果,还提及了相关算法,但未详细阐述。

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

题目描述: 

给定一个链表,若其中包含环,则输出环的入口节点。

若其中不包含环,则输出null

样例

QQ截图20181202023846.png

给定如上所示的链表:
[1, 2, 3, 4, 5, 6]
2
注意,这里的2表示编号是2的节点,节点编号从0开始。所以编号是2的节点就是val等于3的节点。

则输出环的入口节点3.

算法: 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *entryNodeOfLoop(ListNode *head) {
        
        ListNode* meetingNode = MeetingNode(head); //判断是否存在环
        if(meetingNode == NULL)
            return NULL;

        int count = 1;   //统计环的长度
        ListNode* p = meetingNode->next; 
        while(p!=meetingNode)
        {
            p = p->next;
            count++;
        }
        
        ListNode* first = head;
        ListNode* second = head;
        for(int i=0; i<count;i++)  //first 指针从头结点开始走环的长度的节点
            first = first -> next;
        while(first != second)   //然后,first, second 指针同时移动,直到两个指针相遇,此时相遇的地方,就是环的入口节点
        {
            first = first->next;
            second = second->next;
        }
        return  first;
    }
    ListNode* MeetingNode(ListNode* head)
    {
        if(head == NULL)
            return NULL;
        ListNode* slow = head->next;
        if(slow == NULL)
            return NULL;
        
        ListNode* fast = slow->next;
        while(fast!=NULL && slow!=NULL)
        {
            if(fast==slow)
                return fast;
            slow = slow->next;
            fast = fast->next;
            if(fast != NULL)
                fast = fast->next;
        }
        return NULL;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值