【力扣刷题练习】141. 环形链表/142. 环形链表 II

发布时间:2024年01月15日

题目描述1:

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

题目解答:

class Solution {
public:
    bool hasCycle(ListNode* head) {
        ListNode *p = head, *q = head;
        while (q&&q->next) {
            p = p->next;
            q = q->next->next;
            if (p == q)
                return true;
        }
        return false;
    }
};

题目思路:

使用快慢指针的思想,若快指针没能找到链表尾部则说明一定有环结构存在。并且一定存在某时刻快慢指针相遇。

题目描述2:

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

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

题目解答:

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* p=head,*q=head;
        while(q&&q->next){
            p=p->next;
            q=q->next->next;
            if(p==q){
                ListNode *t=head;
                while(t!=p){
                    t=t->next;
                    p=p->next;
                }
                return t;
            }
        }
        return nullptr;
    }
};

题目思路:

本题相较于环形链表原题增加了一点点条件,要求链表成环时返回入环点,我们只需要在双指针相遇时创建一个临时指针指向链表头,并且将其速度设置和慢指针相同,以这个速度可以证明当慢指针继续和临时指针在链表中一同移动时,它们会在入环节点相遇,此时返回临时指针或慢指针即可;若无环结构,则退出while循环并返回一个空指针结束。

文章来源:https://blog.csdn.net/NaturalHarmonia/article/details/135574751
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。