OJ 141 --Linked List Cycle

Description:

Given a linked list, determine if it has a cycle in it.

Follow up:
Can you solve it without using extra space?

描述:

给定一个链表,写一个函数确定这个链表是否有环。空间复杂度为O(1)


思路:

链表有环,则最后一个节点的next指针会指向前面任意一个节点,如果空间复杂度不作要求的话,那么这个题会非常简单,但是题目要求空间复杂度为O(1),那我们就不能使用额外的数据结构来帮助我们解决这个问题。

我们可以想像两个人跑步,一个跑得慢,一个跑得快,

如果他们沿直线跑,那么在有限时间内,他们两个必然不会相遇。

如果他们绕圈跑,那么跑得快的那个人肯定会从后面追上跑得慢的那个人。

这样就提供了解题的思路:

我们需要两个指针,一个指针每次只走一个节点,另外一个指针每次走两个节点,那么必然在某个时候,这两个指针会指向同一个节点,那么这个链表就必然存在环。

所以我们就可以得到下面的代码:

bool hasCycle(ListNode *head) {
        if (head == nullptr) {
            return false;
        }
        ListNode* walker = head;
        ListNode* runner = head;
        
        while (runner->next != nullptr && runner->next->next != nullptr) {
            walker = walker->next;
            runner = runner->next->next;
            if (walker == runner) {
                return true;
            }
        }
        return false;
    }







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值