[LeetCode 题解]: 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?

题意:

给定一个链表,找到环起始的位置。如果环不存在,返回NULL。

分析:

(1)首先要判断该链表是否有环。如果没有环,那么返回NULL。

(2)其次,当已知环存在后,寻找环起始的位置。

思路:

(1)链表是否有环,利用快慢指针很好解决。

(2)当环存在时,寻找环的起始位置:

       ++++使用额外的空间,可以用一个map存放链表的节点,遍历链表: 

       如果当前节点在map中没有出现,那么将该节点加入到map中,否则,返回当前节点(也就是环的起点)。

       -----不使用额外空间,利用快慢指针的特性。  

1st ruond:
SP(start point)                               MP(match point)
A: --------------------------------------------------------MP
B: - - - - - - - - - - - - - MP

2nd round:
B:                           MP- - - - - -- - - - - - - - -MP
C:---------------------------------------------------------MP

3rd round: B1:
- - - - - - - - - - - - - MP B2: MP- - - - - - - - - - - - - - MP B1与B2必定会在途中相遇。 那么,他们首次相遇的点即为环的起始点。

       设定两个指针A,B都从SP(Start point)出发: A每次向后移动两个节点,B每次向后移动一个节点。

       假设A,B在MP(match point)相遇。 那么A所走的路径长度为B所走的路径长度的2倍:La = 2*Lb。

       假设有另一个指针C还是从SP启动,每次向后移动两个节点, B从MP开始出发每次向后移动一个节点,那么可以想象C和B会在MP相遇。

       如果C从SP出发,每次只移动一个节点,B依旧从MP出发且每次向后移动一个节点, 那么B和C依旧会在MP相遇。

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        // list length less than two
        if(head==NULL || head->next==NULL) return NULL;
        // if cycle exists in the list
        ListNode *startA= head->next;
        ListNode *endA= head->next->next;
        while(endA!=NULL && endA != startA){
            endA=endA->next;
            if(endA){
                endA=endA->next;
                startA=startA->next;
            }
        }
        // no cycle exists
        if(endA==NULL) return NULL;
        // find a cycle then search the start point
        ListNode *match = startA;
        ListNode *start = head;
        while(start!=match){
            start = start->next;
            match = match->next;
        }
        return start;        
    }
};

 

作者:Double_Win
由于本人水平有限,文章在表述和代码方面如有不妥之处,欢迎批评指正~
 
posted @ 2014-08-02 20:32  Double_win  阅读(284)  评论(0编辑  收藏  举报