OJ 141 --Linked List Cycle

来源:互联网 发布:女装淘宝店铺名字特别 编辑:程序博客网 时间:2024/06/07 21:06

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;    }