当前位置:   article > 正文

【力扣】203、环形链表 II

【力扣】203、环形链表 II

142. 环形链表 II

要解决这道题,首先需要对问题进行拆解:

  1. 确定链表是否存在环
  2. 确定环的入口点

如何判断是否存在环呢?这个比较容易想到,使用快慢指针即可判断链表是否存在环。我们定义两个指针:

  1. ListNode slow = head;
  2. ListNode fast = head;

让 fast 指针的移动速度是 slow 指针的两倍即可,当它们再次相遇时,说明 fast 指针比 slow 指针多走了一圈,并重新追上 slow 指针了,此时可以说明链表存在环。

  1. while(fast != null && fast.next != null) {
  2. slow = slow.next;
  3. fast = fast.next.next;
  4. // 如果慢指针追上快指针,说明存在环
  5. if(slow == fast) {
  6. ...
  7. }
  8. }
  9. return null;

如何确定环的入口点呢?这涉及到数学推导,这一步不太容易想到:

让我们假设三个变量 x,y,z

可以得到公式如下:

  1. slow指针走过的距离 * 2 = fast指针走过的距离
  2. 于是得到等式如下:
  3. 2(x + y) = (x + y) + n(y + z) // n(y+z)表示fast指针绕环的长度
  4. x + y = n(y + z)
  5. x = nz + (n - 1)y
  6. x = (n - 1)(z + y) + z

因此我们可以知道,在 slow 指针和 fast 指针相遇的节点处,满足该等式:x = (n - 1)(z + y) + z

这个式子表示什么呢?表示一个指针从头节点处出发,到环型入口处经过的距离 x 等于另一个指针从 slow 和 fast 相交的节点处出发,经过 z + (n - 1)(z + y),即走过 z 距离并绕环 n-1 圈,至于这个 n 是多少我们不必知道,于是可以得到以下代码:

  1. // 通过数学规律发现,相交的节点到环的入口处的节点数等于头节点到环入口处的节点数
  2. ListNode temp = head;
  3. // 如果存在环,必定不会死循环
  4. while(temp != slow) {
  5. temp = temp.next;
  6. slow = slow.next;
  7. }
  8. return slow;

至此,题解,完整 Java 代码如下:

  1. /**
  2. * Definition for singly-linked list.
  3. * class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) {
  7. * val = x;
  8. * next = null;
  9. * }
  10. * }
  11. */
  12. public class Solution {
  13. public ListNode detectCycle(ListNode head) {
  14. ListNode slow = head;
  15. ListNode fast = head;
  16. while(fast != null && fast.next != null) {
  17. slow = slow.next;
  18. fast = fast.next.next;
  19. // 如果慢指针追上快指针,说明存在环
  20. if(slow == fast) {
  21. // 通过数学规律发现,相交的节点到环的入口处的节点数等于头节点到环入口处的节点数
  22. ListNode temp = head;
  23. // 如果存在环,必定不会死循环
  24. while(temp != slow) {
  25. temp = temp.next;
  26. slow = slow.next;
  27. }
  28. return slow;
  29. }
  30. }
  31. return null;
  32. }
  33. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/924430
推荐阅读
相关标签
  

闽ICP备14008679号