哈希表匹配法
- set存储遍历过的节点
- 每次遍历查询set中是否有该节点
- 有,则代表该节点为环的起点
- 无,则插入set中,继续遍历链表
class Solution {
public:ListNode *detectCycle(ListNode *head) {unordered_set<ListNode*> myset; while(head) {if(myset.find(head)!=myset.end()) return head;myset.insert(head);head = head->next;}return nullptr;}
};
快慢指针
class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode* slow = head; ListNode* fast = head; while(fast != nullptr) {slow = slow->next; if(fast->next == nullptr)return nullptr;fast = fast->next->next;if(slow == fast){ListNode* ptr = head;while(ptr!=slow){ptr = ptr->next;slow = slow->next;}return ptr;}}return nullptr;}
};