题解 | #链表中环的入口结点#
链表中环的入口结点
https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } */ // 为了保证空间复杂度o(1),不能使用哈希表 // 那么只剩下双指针,之前采用快慢指针判断出是否存在环 // 现在可以根据其长度来得出快慢指针相遇点与环的关系 // 假设从0到入口长度为x,从入口到相遇点长度为y,慢指针走了x+y,快指针走了2x+2y // 那么我们可以得出相遇点到入口位置的长度等于0到入口的长度 public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { // 判断是否存在链表 if(pHead == null){ return null; } // 定义快慢指针 ListNode fastNode = pHead; ListNode slowNode = pHead; // 第一次相遇 while(fastNode != null && slowNode != null){ // 多一重判断,为了防止fastNode下一个点为null导致错误 if(fastNode.next == null){ return null; } fastNode = fastNode.next.next; slowNode = slowNode.next; // 第一次相遇跳出循环,即slowNode和fastNode就是相遇点 if(fastNode == slowNode){ break; } } // 首先判断是相遇break还是链表null if(fastNode == null){ return null; } // 正常移动,都1步移动,相遇点极为入口 slowNode = pHead; while(fastNode != slowNode){ slowNode = slowNode.next; fastNode = fastNode.next; } // 跳出循环即为相遇,输出 return slowNode; } }