牛客题霸NC3链表中环的入口节点Java题解
方法:快慢指针
解题思路:利用快慢指针,快指针每次走2步,慢指针每次走1步,当快指针和慢指针相遇时,再让一个新的慢指针从起点出发(此时,原慢指针在和快指针的相遇点),让新慢指针和原慢指针同时出发,这样,当新慢指针和原慢指针再次相遇时,就i是链表中环的入口节点。
/** * 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(fast != null && fast.next != null){ fast = fast.next.next; slow = slow.next; if(fast == slow){ //利用快慢指针找相遇点 ListNode newSlow = head; //新慢指针从起始位置出发 while(newSlow != slow){ //新旧慢指针相遇时就是环的入口节点位置 slow = slow.next; newSlow = newSlow.next; } return slow; } } return null; } }