环形链表 II

题目描述

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

说明:不允许修改给定的链表。

进阶:
你是否可以不用额外空间解决此题?

分析

用双指针遍历求相交的节点。
慢指针和快指针的初始位置是:head
慢指针一次前进一步,快指针一次前进两步。
两个指针相交的节点为C。
设非循环链表部分为X,循环链表中C节点之前的部分为Y ,C之后的部分为Z,可以根据快指针和慢指针经过的节点数列出方程:
2*(X + Y) = X + Y + Z + Y
解方程得到:X = Z
让慢指针从C节点出发,快指针从head出发,一次前进一步,相等的节点为入环的第一个节点
方程左边的慢指针遍历的节点数,右边为快指针遍历的节点数,
链表:
1 -> 2 -> 3 -> 4,循环节点为3,
慢指针遍历的节点是:2,3
快指针遍历的节点是:2,3,4,3
起始位置的节点不算
相交的节点是:3
X = 2
Z = 4
Y = 3

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        if(head == NULL) {
            return NULL;
        }
        auto slow = head;
        auto quick = head;
        bool circle = false;
        while(quick != NULL && quick->next != NULL) {
            slow = slow->next;
            quick = quick->next->next;
            if(quick == slow){
                circle = true;
                break;
            }
        }
        if(!circle) {
            return NULL;
        }
        quick = head;
        while(slow != quick) {
            slow = slow->next;
            quick = quick->next;
        }
        return slow;
    }
};

题目链接

https://leetcode-cn.com/explore/interview/card/tencent/222/linked-list/917/

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。说明:不允许修改给定的链表。 代码
    vbuer阅读 198评论 0 0
  • 1. 找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,...
    BookThief阅读 1,982评论 0 2
  • 幼儿老师真的会打孩子吗 看到这个标题,你的心里肯定已经不断涌现新闻报道中的各种幼儿老师虐待孩子的照片。那么现实...
    一世宁香阅读 1,188评论 0 2
  • 一切可以妥当的一定会妥当,准备迎接奇迹! 感恩 公司的网络这几天都很慢,很感恩电脑部的同事帮我设置,而且另外开了一...
    belivePossible阅读 143评论 0 1
  • 又沐春风 - 朱桦 冰雪消融在你的双眸 春风又吹绿枝头 让我的手牵着你的手 去阳光下走走 温暖又把大地拥抱的消息 ...
    我心飞扬3666阅读 516评论 0 0

友情链接更多精彩内容