三尺非寒 发表于 2025-3-14 07:57:41

力扣——环形链表 II

题目链接:

链接
题目描述:

https://i-blog.csdnimg.cn/direct/eeb7d06d7a6342368bd7bb6f9053dc80.png
思路:

我们知道用快慢指针遍历环形链表,两个指针肯定会相遇
如果从相同的出发点出发,快指针每次走两步,慢指针走一步,
https://i-blog.csdnimg.cn/direct/55eef4fbc4b84f609b8ea30a16905918.png
相同的时间内,快指针的旅程是慢指针的两倍
当他们相遇时,快指针已经在环里走了n圈,但是慢指针是第一次进环
相遇时有
                                       2                            (                            a                            +                            b                            )                            =                            a                            +                            n                            (                            b                            +                            c                            )                            +                            b                                     a                            =                            (                            n                            −                            1                            )                            b                            +                            n                            c                                     a                            =                            (                            n                            −                            1                            )                            (                            b                            +                            c                            )                            +                            c                                  2(a+b)=a+n(b+c)+b\\ a=(n-1)b+nc\\ a=(n-1)(b+c)+c                     2(a+b)=a+n(b+c)+ba=(n−1)b+nca=(n−1)(b+c)+c
在这一点,我们能得到两段相等的间隔,如果有点从开头走完a,相当于一点走完c并在环里走几圈,如果有两个速度为1的点这样走,它们末了肯定会相遇,而且就是在环的入口处相遇
实现代码:


[*]
public class Solution {
    public ListNode detectCycle(ListNode head) {
      if(head == null){
            return null;
      }
      ListNode slow = head, fast = head;
      while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
            if(fast == slow){
                ListNode tmp = head;
                while(tmp != slow){
                  tmp = tmp.next;
                  slow = slow.next;
                }
                return tmp;
            }
      }
      return null;
    }
}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 力扣——环形链表 II