【Java算法题解】剑指 Offer II 022. 链表中环的入口节点
【摘要】
解析
先通过快慢指针判断有无环
无环
直接返回null
有环
假设起点到环起点的距离是a,环的长度是k,且此时A、B在距离环起点x距离处相遇。 即慢指针再走x步就到达环的入口,此时slow走过...
解析
先通过快慢指针判断有无环
无环
直接返回null
有环
假设起点到环起点的距离是a,环的长度是k,且此时A、B在距离环起点x距离处相遇。
即慢指针再走x步就到达环的入口,此时slow走过的距离
a + nk + (k - x)
快指针走过的距离:
a + mk + (k - x)
由快慢的定义可知:
a + mk + (k - x) = 2 * (a + nk + (k - x))
化简得:
a = (m - 2n -1)k + x
可知a为k的整数倍加x,而AB相遇的位置再走x步恰是环入口,所以此时让其中一个指针指向起点,然后同步走,一定能在环入口相遇!
所以可得代码:
package com.javaedge;
/**
* @author JavaEdge
* @date 2021/8/17
*/
public class DetectCycle {
static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
public ListNode detectCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
boolean isCircled = false;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
isCircled = true;
break;
}
}
if (!isCircled) {
// 无环
return null;
}
slow = head;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
文章来源: javaedge.blog.csdn.net,作者:JavaEdge.,版权归原作者所有,如需转载,请联系作者。
原文链接:javaedge.blog.csdn.net/article/details/119739155
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)