Linked List Cycle

/*
    开始用hash做的,但这明显不是最优的
*/
/**
 * 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) {
        map<ListNode *,int>m;
        while(head){
            if(m[head]) return true;
            m[head] = 1;
            head = head->next;
        }
        return false;
    }
};

 

 

/**
 * 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 *p1 = head,*p2 = head->next;
        while(p1&&p2&&p2->next){//{},{1}这种都没有圈
            p1 = p1->next;
            p2 = p2->next->next;
            if(p1 == p2) return true;
        }
        return false;
    }
};

 

posted @ 2015-03-15 13:48  SprayT  阅读(102)  评论(0编辑  收藏  举报