LeetCode 142: Linked List Cycle II

题目描述:

Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

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

思路:

 开始也是没有思路,无奈只有从网上面找idea,发现一个非常好的帖子来讲这个问题,并且把相关的几个问题一块总结出来,有关链表中存在环的问题有以下相关的几个:

1.链表中是否存在环。

2.存在环的话是从哪开始,从头开始还是从中间某个位置开始

3.两个环是否相交

4.如果一个链表中存在环,那么如何确定环开始的位置,并把环解开,成为无环的链表。

其实以上四个问题归结起来首先要解决的就是链表中是否有环这个问题,这个问题比较好解决,之前的文章曾经写过,两个指针一个走的快,一个走的慢,如果慢的追上快的,那么链表就存在环。

那么环开始的位置在哪呢?这个网上有个非常好的解释(http://blog.sina.com.cn/s/blog_6f611c300101fs1l.html),就是将链表划为a,b,c三段,然后能得到公式2(a+b) = a+b+c+b,剩下的也就很容易能够想到如何来写代码求解啦。

那么两个环的问题呢,同样首先要判断两个链表是否都存在环,然后判断两个环是否是一个环就好啦。

将链表的环解开,那么就是找到环开始的位置,环结束的位置,将环结束的节点的next置null就好了。

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        if(!head) return NULL;
        ListNode *p = head;
        ListNode *q = head;
        do{
            if(!p||!q) return NULL;
            p = p->next;
            q = q->next;
            if(q) q = q->next;
            else return NULL;
        }while(p!=q);

        p = head;
        while(p!=q){
            p = p->next;
            q = q->next;
        }
        return p;
    }
};

  

原文地址:https://www.cnblogs.com/xiamaogeng/p/4415257.html