leetcode 面試題02.08.環路檢測 Java

雲水冰發表於2020-10-22

題目連結

https://leetcode-cn.com/problems/linked-list-cycle-lcci/

描述

給定一個連結串列,如果它是有環連結串列,實現一個演算法返回環路的開頭節點。
有環連結串列的定義:在連結串列中某個節點的next元素指向在它前面出現過的節點,則表明該連結串列存在環路。
 
進階:
你是否可以不用額外空間解決此題?

示例

示例 1:

輸入:head = [3,2,0,-4], pos = 1
輸出:tail connects to node index 1
解釋:連結串列中有一個環,其尾部連線到第二個節點。

示例 2:

輸入:head = [1,2], pos = 0
輸出:tail connects to node index 0
解釋:連結串列中有一個環,其尾部連線到第一個節點。

示例 3:

輸入:head = [1], pos = -1
輸出:no cycle
解釋:連結串列中沒有環。

初始程式碼模板

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
       
    }
}

程式碼

這麼做為什麼可以,看圖就可以:
在這裡插入圖片描述

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;

        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;

            if (fast == slow) {
                break;
            }
        }

        if (fast == null || fast.next == null) {
            return null;
        }

        fast = head;

        while (fast != slow) {
            fast = fast.next;
            slow = slow.next;
        }

        return slow;
    }
}

相關文章