142.环形链表 ||

一、哈希表

我们遍历链表中的每个节点,并将它记录下来;一旦遇到了此前遍历过的节点,就可以判定链表中存在环。借助哈希表可以很方便地实现。

  1. class Solution {
  2. public:
  3. ListNode *detectCycle(ListNode *head) {
  4. ListNode* cur = head;
  5. unordered_set<ListNode*> set;
  6. while(cur)
  7. {
  8. if(set.find(cur)==set.end())
  9. {
  10. set.insert(cur);
  11. cur = cur->next;
  12. }
  13. else
  14. return cur;
  15. }
  16. return NULL;
  17. }
  18. };

二、快慢指针

  1. class Solution {
  2. public:
  3. ListNode *detectCycle(ListNode *head) {
  4. ListNode* slow = head;
  5. ListNode* fast = head;
  6. //遍历快慢指针,每次快指针移动两步,慢指针移动一步
  7. //当快指针为NULL时,返回NULL
  8. while(fast)
  9. {
  10. //因为快指针每次走两步,所以要判断fast的下一节点是否为NULL
  11. //若为NULL,则会报错,因为无法走两步
  12. if(fast->next==NULL)
  13. return NULL;
  14. slow = slow->next;
  15. fast = fast->next->next;
  16. if(fast==slow)
  17. {
  18. ListNode* temp = head;
  19. while(temp!=slow)
  20. {
  21. temp = temp->next;
  22. slow =slow->next;
  23. }
  24. return temp;
  25. }
  26. }
  27. return NULL;
  28. }
  29. };