leetcode Linked List Cycle

题目链接

linked-list-cycle

题目描述(Description)

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?

链表是否有环

给你一个链表,判断它是否有环?

进一步:

你能在不使用额外空间解决这个问题吗?

分析(Analysis)

  • 由两个人在圆形操场跑步引发的思路:如果两个人同一起点同时开始跑步,由于操场是圆形的,且一人速度快一人速度慢,那么在有限时间内,跑的快的人总能遇上跑的慢的人。

  • 在此题中,设置两个指针slowfastslow每次走一步,fast每次走两步,如果链表存在环,那么总能出现slow==fast,注意这里fast->next->next存在的前提是fast->next!=NULL,而fast->next存在的条件是fase!=NULL,这两个作为继续追赶(循环)的判断条件。

  • 如果链表为空,返回false

代码(Code)

空间复杂度O(1)

/**
 * 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)
            return false;
        ListNode *slow=head,*fast=head;
        while(fast&&fast->next){
            slow=slow->next;
            fast=fast->next->next;
            if(slow==fast)
                return true;
        }
        return false;
    }
};