题目链接:142. 环形链表 II - 力扣(LeetCode)
代码地址:LeetCode/src/lianBiao/_142_环形链表II.java · HuaCai/Algorithm - 码云 - 开源中国 (gitee.com)
解题思路: 假设表头到环的起点距离是A,环的起点到快慢指针相遇的距离为B,环的长度减去B剩余的长度为C。暂且以快慢指针相遇时,快指针比慢指针多走了一个环(多走了n个环也是同理)。那么相遇时慢指针走的距离是A+B,快指针走到距离是A+2B+C因为慢指针每次走一步,快指针每次走两步,那么 2(A+B)==A+2B+C,可得 A==C。那么A.next==C.next时,即为环的起点
class Solution142 {
public ListNode detectCycle(ListNode head) {
if (head == null) return null;
ListNode slow = head, fast = head;
boolean flag = false;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
flag = true;
break;
}
}
if (flag) {
slow = head;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
return null;
}
}
时间复杂度:O(n);空间复杂度:O(1)。