【LeetCode练习】[中等]剑指 Offer II 022. 链表中环的入口节点
剑指 Offer II 022. 链表中环的入口节点
算法思想:环形链表,快慢指针
题目:
问题分析
快慢指针;
慢指针:向后移动一个结点;
快指针:向后移动两个结点;
找到相遇的节点,然后再计算入口节点;计算如图所示:
2(x + y1) = x+y1+y2+y1
即:x = y2
java代码–信号量
public class Solution {
public ListNode detectCycle(ListNode head) {
// 快慢指针
ListNode slow = head;
ListNode fast = head;
// 判断是否存在节点
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
// 相遇, 需要计算入口;
if (slow == fast){
ListNode ptr = head;
while(ptr != slow){
ptr = ptr.next;
slow = slow.next;
}
return ptr;
}
}
return null;
}
}