Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
分析:用map记录是否出现过。
用时:60ms
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 bool hasCycle(ListNode *head) { 12 if(!head || !head->next) return false; 13 14 map<ListNode*, bool> m; 15 while(head){ 16 if(m.find(head) == m.end()) m[head] = true; 17 else return true; 18 head = head->next; 19 } 20 return false; 21 } 22 };
看到比较好的方法:设置两个指针,一个快(每次走两步),一个慢(每次走一步)。如果快慢指针相遇,那么表示有环,否则无环。
用时16ms。远优于使用map的方式。
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 bool hasCycle(ListNode *head) { 12 if(!head || !head->next) return false; 13 14 ListNode *fast = head, *slow = head; 15 while(fast && fast->next){ 16 fast = fast->next->next; 17 slow = slow->next; 18 if(fast == slow) return true; 19 } 20 return false; 21 } 22 };