力扣刷题:2-环形链表 II(142)

69 阅读1分钟

这也是一道在链表中找环的题目,但是,它稍微要复杂一点,不但要判断是否存在环,还要找出入环的第一个节点。 首先还要使用快慢指针的方式找出第一次相遇的节点,这时当前指针距离入环的节点位置,和从头节点到入环节点位置的距离相同。因此,只要将其中一个节点指针指向头节点,两个指针同时移动,当他们相遇的位置,就是入环的第一个节点。

下面是C语言实现的算法:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *slow = head;
    struct ListNode *fast = head;
    // 首先判断相遇的节点
    while (fast != NULL && fast->next != NULL) {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast) {
            break;
        }
    }
    if (fast != NULL && fast->next != NULL) {
        // 存在环,且在环上相遇了
        slow = head;
        while (slow != fast) {
            slow = slow->next;
            fast = fast->next;
        }
        return slow;
    }
    return NULL;
}