欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode刷题(188)~环形链表 II【哈希|快慢指针】

程序员文章站 2022-06-18 10:57:17
...

题目描述

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

说明:不允许修改给定的链表。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。

LeetCode刷题(188)~环形链表 II【哈希|快慢指针】

示例 2:

输入:head = [1,2], pos = 0
输出:tail connects to node index 0
解释:链表中有一个环,其尾部连接到第一个节点。

LeetCode刷题(188)~环形链表 II【哈希|快慢指针】

示例 3:

输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。

LeetCode刷题(188)~环形链表 II【哈希|快慢指针】

进阶:

  • 你是否可以不用额外空间解决此题?

解答 By 海轰

提交代码(哈希)

ListNode *detectCycle(ListNode *head) {
        unordered_set<ListNode*> s;
        while(head){
            if(s.find(head)==s.end()){
                 s.insert(head);
                 head=head->next;
            }else{
                return head;
            }
        }
        return NULL;      
    }

运行结果
LeetCode刷题(188)~环形链表 II【哈希|快慢指针】
提交代码(快慢指针)

 ListNode *detectCycle(ListNode *head) {
     ListNode* fast=head;
     ListNode* slow=head;
     while(fast){
         slow=slow->next;
         if(!fast->next) return NULL;
         fast=fast->next->next;
         if(slow==fast){
             ListNode* ptr=head;
             while(ptr!=slow){
                 ptr=ptr->next;
                 slow=slow->next;
             }
             return ptr;
         }
     }
     return NULL;
    }

运行结果
LeetCode刷题(188)~环形链表 II【哈希|快慢指针】

题目来源

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/linked-list-cycle-ii

相关标签: 算法 leetcode