每日一题-Day34-判断链表是否有环

题目

判断链表是否有环

解题思路

floyd判环算法:假设链表有环,使用fast和slow两个指针,fast每次移动是slow的n倍,slow每次移动一步,我们采用n=2来进行举例

  1. 令slow和fast指针开始移动,直至相遇(链表有环),此时slow移动了s步,fast移动了2s
  2. 将slow移动至链表起点,再次移动slow和fast指针,直至相遇,此时slow和fast在链表的环结点相遇,slow移动了s+m,fast移动了2s+m
  3. 推导结果参考
/*
 * 返回环的首结点
 */
class Solution {
    public ListNode findLoop(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
        Boolean haveLoop = false;
        if (head == null) {return 0};
        
        while (slow.next != null && fast.next.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) {
                haveLoop = true;
                break;
            }
            if (haveLoop) {
                fast = head;
                while (slow != fast) {
                    slow = slow.next;
                    fast = fast.next;
                }
                return slow;
            }
            return null;
        }
    }
}
posted @ 2021-12-15 15:41  2月2日  阅读(35)  评论(0)    收藏  举报