[cc150] 2.5

2.5 Given a circular linked list, implement an algorithm which returns node at the beginning of the loop.

Input: A-> B -> C -> D -> E -> C(the same C as earlier)

Output: C

介个题目代表了一类有环链表的问题。思路比较固定啦~~

一个很老的题目就是判断两个链表是否有环,答案就是两个指针,第一个每次走一步,第二个每次走两步,若两个最终相遇的话就是有环。相当于两个伦在绕圈跑,快的总是会追上慢的。

回到这个题目,假设相遇时p走了n步,q走了2n步,相遇是,两个人的路程差应该是环的长度S,则

2n - n = S => n = S

假设不在环的部分长度为k,则两个人相遇的位置S-k

先已知相遇的位置,求k就很容易啦~~

class Solution { 
public: 
    ListNode* findBeginning(ListNode *head){ 
        ListNode *p = head, *q = head; 
         
        while (q -> next) { 
            p = p -> next; 
            q = q -> next -> next; 
            if ( p == q) { 
                break; 
            } 
        } 
         
        if (!(q -> next)) { 
            //no meeting point 
            return NULL; 
        } 
         
        p = head; 
        while (p != q) { 
            p = p -> next; 
            q = q -> next; 
        } 
         
        return p; 
    } 
}; 


你可能感兴趣的:(cc150)