LeetCode-Linked List Cycle

来源:互联网 发布:安卓游戏开发知乎 编辑:程序博客网 时间:2024/05/15 14:41

寻找链表是否有环
方法是快慢指针

这里写图片描述

第一次相遇时slow走过的距离:a+b,fast走过的距离:a+b+c+b。
因为fast的速度是slow的两倍,所以fast走的距离是slow的两倍,有 2(a+b) = a+b+c+b,可以得到a=c

slow肯定没有走够超过一圈,在第一圈的中间停下来。假设直接就在圆上,则必定slow走一圈相遇,若前面还有一截,则不必等到一圈即可相遇。同时起步是最远的距离。

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)                  break;          }          if(fast == null || fast.next == null)              return null;          slow = head;          while(slow != fast){              slow = slow.next;              fast = fast.next;          }          return fast;      }  }
原创粉丝点击