LeetCode OJ-141. Linked List Cycle(链表找环)

来源:互联网 发布:网络创业优势 编辑:程序博客网 时间:2024/06/07 20:55
141. Linked List Cycle

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

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

链表找环问题,如果不在意时间,可以直接使用O(n^2)的解法求解,且也比较容易理解,最外层循环遍历每个节点直至NULL,内层循环则在节点之后继续遍历,若某个节点的地址值等于外层循环遍历的当前节点,则代表有环。
对于LeetCode上,使用这个方法是没法通过的,随时结果没问题。这里则要使用另一种方法,如果链表是存在环的,那么在环的入口点继续遍历,将可能反复地遍历到这个环入口点,所以这里就可以使用两个变量来记录节点,让一个以步长1遍历,另一个以步长2遍历,显然步长2的遍历方式将会比步长1的快,若链表存在环,步长2的遍历方式将会在某时刻与步长1的遍历方式相遇。具体代码如下:
/** * Definition for singly-linked list. * struct ListNode { *     int val; *     struct ListNode *next; * }; */bool hasCycle(struct ListNode *head) {    struct ListNode *one = head;    struct ListNode *two = head;    while (one != NULL && two != NULL && two->next != NULL) {        one = one->next;        two = two->next->next;        if (one == two) {            return true;        }    }        return false;}


0 0