题解 | #判断链表中是否有环#
判断链表中是否有环
https://www.nowcoder.com/practice/650474f313294468a4ded3ce0f7898b9
本题有两种方法:
第一种:使用「集合」容器进行存储,当需要检测元素是否存在时,调用容器的 find方法
C++ 可以使用unordered_set
, python 可以使用 set
python 的 in 关键字让代码的含义简单直接
第二种:使用快慢指针,一个快一个慢,如果存在环的话,这两个指针一定会相遇
美观的代码:
可复制的代码:
class Solution { public: bool hasCycle1(ListNode *head) { // 思路分析: // 所谓的“环”,其实只是一个节点的下一个节点恰好是之前出现的节点 // 可以将之前出现过得节点都存储起来 // 由于只是检测 存在性, 所以可以使用包含 find方法的容器 // 但是这样子的话,空间复杂度为 O(n) // 真的存在空间复杂度为 O(1)的方法吗? unordered_set<ListNode*> set_; while (head != nullptr) { set_.emplace(head); head = head->next; if (set_.find(head) != set_.end()) { return true; } } return false; } // 使用快慢指针的方法 bool hasCycle(ListNode *head) { ListNode *slow = head; ListNode *fast = head; while (fast && fast->next) { slow = slow->next; fast = fast->next->next; if (slow == fast) return true; } return false; } };