141. Linked List Cycle

Posted 蓝色地中海

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了141. Linked List Cycle相关的知识,希望对你有一定的参考价值。

Problem statement

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

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

Solution

This is a classical problem in a linked list. It is chosen for interview by many high-tech companies.

The generally idea is also a very good philosophy in linked list -->  Fast and slow pointers.

  • Define two pointers, fast and slow.
  • Each time fast goes two step and slow goes one step.
  • If there is a loop, they must met sometime.
  • Otherwise, fast will become NULL first.

Time complexity is O(n), space complexity is O(1)

The following solution follows the idea to find the middle of a link list. Fast pointer should goes faster than slow at start.

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(head == NULL){
            return false;
        }
        ListNode* fast = head->next;
        ListNode* slow = head;
        while(fast != NULL && fast->next != NULL){
            if(fast == slow){
                return true;
            }
            fast = fast->next->next;
            slow = slow->next;
        }
        return false;
    }
};

This solution do not need to do the test at beginning of the program, however, fast is initialized the same value of slow.

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast != NULL && fast->next != NULL){
            fast = fast->next->next;
            slow = slow->next;
            if(fast == slow){
                return true;
            }
        }
        return false;
    }
};

 

以上是关于141. Linked List Cycle的主要内容,如果未能解决你的问题,请参考以下文章

141. Linked List Cycle

141. Linked List Cycle

141. Linked List Cycle

141. Linked List Cycle

算法分析如何理解快慢指针?判断linked list中是否有环找到环的起始节点位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycl(代码

141. Linked List Cycle