环形链表 找进环的结点

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

解题思路:(快慢指针)
f为快指针所走的步数
s为慢指针所走的步数
a为入环前所有的结点数
b为环里面所有的结点数
n为所走的圈数

第一次相遇
(1)f=2s
(2)f=s+nb
由(1)(2)得 
f=2nb
s=nb

假设我们从开始统计步数k
则k=a+nb时走到入环的第一个结点
看上面 s=nb 在这个时间点如果s再走a步刚好到入环的第一个结点

问题转变为求a
把f指针指向头结点 然后让f和s一起走 直到两者相撞则返回slow值就可
此时
f=a
s=a+nb

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    
    
    public ListNode detectCycle(ListNode head) {
    
    
        ListNode slow = head;
        ListNode fast = head;
        while(true)
        {
    
    
            if(fast == null || fast.next == null)
            //注意这块要用fast指针来判断,开始错用了slow指针
                return null;
            slow=slow.next;
            fast=fast.next.next;
            if(slow == fast) break;
        }
        fast = head;
        while(fast != slow)
        {
    
    
            slow=slow.next;
            fast=fast.next;
            if(slow == fast)
                break;
        }
        return slow;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_45663946/article/details/108990329