惊落一身雪 发表于 2025-1-8 15:57:59

141.环形链表 & 142.环形链表II

141.环形链表 & 142.环形链表II

141.环形链表

思路:快慢指针 or 哈希表

快慢指针代码:

class Solution {
public:
    bool hasCycle(ListNode *head) {
      if(head==nullptr||head->next==nullptr)
      return false;
      ListNode *fast=head->next; //不能设置成head,否则不进入while循环
      ListNode *slow=head;
      while(fast!=slow){
            //如果无环fast在slow前面,只需要判断fast
            if(fast->next!=nullptr&&fast->next->next!=nullptr){
                fast=fast->next->next;
                slow=slow->next;
            }else{//无环
                return false;
            }
      }
      return true;
    }
};
哈希表代码:

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
      unordered_set<ListNode*> hash;
      ListNode* cur=head;
      while(cur!=nullptr){
            //哈希表中出现过
            if(hash.count(cur)){
                return cur;
            }
            hash.insert(cur);
            cur=cur->next;
      }
      return nullptr;
    }
};
142.环形链表II

思路:快慢指针+数学推导 or 哈希表

哈希表同前,数学推导见下图,
https://i-blog.csdnimg.cn/direct/f157a5a45b9940fb81442c13c1c20d8d.png
代码:

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
      ListNode *slow = head, *fast = head;
      while (fast != nullptr) {
            slow = slow->next;
            if (fast->next == nullptr) {
                return nullptr;
            }
            fast = fast->next->next;
            if (fast == slow) {
                ListNode *ptr = head;
                while (ptr != slow) {
                  ptr = ptr->next;
                  slow = slow->next;
                }
                return ptr;
            }
      }
      return nullptr;
    }
};


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 141.环形链表 & 142.环形链表II