leetcode_142环形链表II

一、题目

leetcode_142环形链表II

 

 

二、分析

     这个题目很有意思,最开始我也没有想到很好的解法,但是发现题目使用的双指针方法很有效,就是利用快慢指针的方法去判断是否存在环,如果存在则使用其判断具体位置,这个和删除倒数第几个节点的那道题目很类似。

   具体题目可以看这个分析:

   题目分析

三、代码

/**
 * 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) {
        if(head == NULL || head->next == NULL )
            return NULL;
        //检测是否有环
        ListNode* fast=head;
        ListNode* slow=head;
        while(fast!=NULL && fast->next!=NULL){
            fast= fast->next->next;
            slow= slow->next;
            if(fast==slow)break;
        }
        //如果为空,则说明无环
        if(fast==NULL || fast->next==NULL){
            return NULL;
        }
        //如果有环,则开始寻找环的位置
        fast=head;
        while(fast != slow){
            fast = fast->next;
            slow = slow->next;
        }
        return slow;
    }
};

 

上一篇:142、环形链表||


下一篇:Leetcode 142. 环形链表 II