0
点赞
收藏
分享

微信扫一扫

Leetcode 142.环形链表II

婉殇成长笔记 2022-04-17 阅读 133
算法
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* slow=head;
        ListNode* fast=head;
        while(fast!=NULL&&fast->next!=NULL){     //快慢指针法常用的判断方法
            slow=slow->next;
            fast=fast->next->next;
            if(slow==fast){
                break;
            }
        }  
        //上面的代码类似 141.里的hasCycle()函数
        if (fast == NULL || fast->next == NULL) {  // fast 遇到空指针说明没有环
            return NULL;
        }
        // 重新指向头结点
        slow = head;
        // 快慢指针同步前进,相交点就是环起点
        while (slow != fast) {
            fast = fast->next;
            slow = slow->next;
        }
        return slow;
    }
};

解法:

当快慢指针相遇时,让其中任一个指针指向头节点,然后让它俩以相同速度前进,再次相遇时所在的节点位置就是环开始的位置。

举报

相关推荐

0 条评论