【LeetCode】141.Linked List Cycle

1228 ワード

タイトル:
         Given a linked list, determine if it has a cycle in it.
         Follow up:          Can you solve it without using extra space?
理解:
余分なスペースがない場合は、チェーンテーブルにリングがあるかどうかを判断します.
分析:
このテーマは出会い問題として理解できる.もし二人が同時に同じ場所から出発して、一人はスピードが速くて、一人はスピードが遅くて、もしこの経路にリングがあれば、彼らはきっと出会って、この時スピードの速い人はちょうどスピードの遅い人より多くこのリングの道を歩いた.
これにより、2つのポインタformerとlatterを設定し、同時に最初からノードを出発し、formerは一度に2つのノードを歩き、latterは一度に1つのノードを歩くことができる.formerがlatterと出会うと、このチェーンテーブルにはリングが含まれていることを示します.formerまたはlatterがNULLに遭遇した場合、このチェーンテーブルにはループが含まれていないことを示します.
コード:
/**
 * 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 *former=head;
        ListNode *latter=head;
        while(former!=NULL&&latter!=NULL)
        {
            former=former->next;
            if(former!=NULL)
                former=former->next;
            else
                return false;
            latter=latter->next;
            if(former==latter)
                return true;
        }
        return false;
    }
};