leetcode142---环形链表II

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

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

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

示例 :

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

解题思路:

以慢指针走一步,快指针走两步 相遇时慢指针一定不可能走超过一圈;

设定链头到环的第一点为s;

环一共有c个节点:

相遇时由环入口点到相遇点的节点数设为g;

则在相遇时设慢指针走了g+s点,

快指针走了k*c+s+g点;k大于0;

慢指针和快指针的速度为倍数关系:

==>      2(g+s) == k*c + s +g

==>       g + s == k*c

==>        s  = (k-1)*c + (c-g)

环的倍数可以省略:

则链表头到环入口的距离等于相遇点到环入口的距离:


 struct ListNode* hasCycle(struct ListNode *head) {
    struct ListNode* fast, *low;
    fast = low = head;
    while(fast && fast->next) {
        fast = fast->next->next;
        low = low->next;
        if(fast == low) {
            return fast;
        }
    }
    return NULL;
}

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode* pos;
    struct ListNode* meet;
    struct ListNode* start = head;
    meet = hasCycle(head);
    if(meet == NULL) {
        return NULL;
    }
    while(1) {
        if(meet == start) {
            return start;
        }
        meet = meet->next;
        start = start->next;
    }

}

运行结果:

发布了51 篇原创文章 · 获赞 2 · 访问量 872

猜你喜欢

转载自blog.csdn.net/scacacac/article/details/105313465