【LeetCode】环形链表II

夙愿已清 提交于 2020-02-08 00:55:02

题目描述

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
**说明:**不允许修改给定的链表。
示例1:
在这里插入图片描述
示例2:
在这里插入图片描述
示例3:
在这里插入图片描述

解题思路

可以分为两个部分。首先判断出该链表是否有环。其次,用相遇结点来找到环的入口。
第一部分:设置快、慢两个指针,慢指针走一步,快指针走两步。如果链表中不存在环,快指针最终会走到尾部,此时返回NULL;若链表中存在环,快指针最终会追上慢指针,返回相遇结点。
第二部分:设置meet指针指向根据第一部分找出的相遇结点,然后每次将meet指针和head指针往前移动一步,直到它们相遇,它们相遇的点就是环的入口,返回这个节点。

完整代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 //判断链表是否有环
struct ListNode *hasCycle(struct ListNode *head) {
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    while(fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
        if(fast == slow)
        {
            return fast;
        }
    }
    return NULL;
}

//找环的入口
struct ListNode* detectCycle(struct ListNode* head){
    struct ListNode* meet = hasCycle(head);
    if(meet == NULL)
    {
        return NULL;
    }
    while(1)
    {
        if(meet == head)
        {
            return meet;
        }
        meet = meet->next;
        head = head->next;
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!