美文网首页程序员
和我一起在LeetCode刷题吧(每天一题LeetCode

和我一起在LeetCode刷题吧(每天一题LeetCode

作者: 北斗星君 | 来源:发表于2020-03-08 19:50 被阅读0次

    分类标签:链表        

    难易度:中等

    题目描述:

    给定一个有环链表,实现一个算法返回环路的开头节点。

    有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路。

    示例 1:

    输入:head = [3,2,0,-4], pos = 1

    输出:tail connects to node index 1

    解释:链表中有一个环,其尾部连接到第二个节点。

    示例 2:

    输入:head = [1,2], pos = 0

    输出:tail connects to node index 0

    解释:链表中有一个环,其尾部连接到第一个节点。

    示例 3:

    输入:head = [1], pos = -1

    输出:no cycle

    解释:链表中没有环。

    思路:快慢指针

    1.利用快慢指针分别遍历链表,检测链表是否为环形链表,如果不是返回NULL值;

    2.如果是环形链表,则将fast返回到头指针head的位置,fast指针和slow指针每一次移动一个位置,则第一次重叠处就是环路的交点

    代码:

    struct ListNode *detectCycle(struct ListNode *head) {

      if(head==NULL||head->next==NULL)

          return NULL;

        struct ListNode *fast=head,*slow=head;

    //检测是否有环路

        while(fast!=NULL||fast->next!=NULL)

    {

        fast=fast->next->next;

        slow=slow->next;

        if(fast==slow)

            break;

        if (fast == NULL || fast->next == NULL)

            return NULL;

    }   

        fast=head;

    //检测环路中相交的交点

        while(fast!=NULL)

        {

            if(fast!=slow)

            {

                slow=slow->next;

                fast=fast->next;

            }

            else

                return slow;

        } 

    return 0;

    }

    运行结果:

    运行结果 占用的时间和空间

    相关文章

      网友评论

        本文标题:和我一起在LeetCode刷题吧(每天一题LeetCode

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