LeetCode 141. Linked List Cycle

題目

Given a linked list, determine if it has a cycle in it.

Follow up: Can you solve it without using extra space?

翻譯

給一個連結陣列,判斷裡面是不是包含一個循環連結。

進階: 你能不使用額外的空間來解這題嗎?

範例:

  • [1,2,3,2,3,2.....],[1]的next是[2]
  • [2]的next是[3]
  • [3]的next是[2],從上一步我們知道2的next是[3],所以這是一個循環連結

假如[1,2,3,2,3],那就不是一個連結陣列迴圈,因為最後的[3]next並不是[2],所以循環連結不成立。

思路

拜訪節點後就給他一個拜訪過的標計,如果目前拜訪的節點已經被標計了,代表這是一個循環連結。

解題

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {boolean}
 */
var hasCycle = function(head) {
    if(head == null || head.next == null){
        return false; 
    }
    var node = head;
    while(node != null ){
        if(node.flag){
            return true;
        }    
        // 標記這個node已經跑過
        node.flag = true;   
        node = node.next;
    }
    return false;

進階

  • 使用快慢指針這個想法來解
  • 慢指針一次只跑一格,快指針一次跑兩格
  • 如果是一個循環連結,快慢指針一定會相遇
/**
 * @param {ListNode} head
 * @return {boolean}
 */
var hasCycle = function(head) {
    if(head == null || head.next == null){
        return false; 
    }

    var slow = head.next;
    var fast = head.next.next;
    if(fast == null){
        return false;
    }

    while(slow != fast){
        if(fast.next == null){
            return false;
        }
        slow = slow.next;
        fast = fast.next.next;

        if(slow == null || fast == null){
            return false;
        }
    }
    return true;
}

results matching ""

    No results matching ""