[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就很容易啦~~

  
  
  
  
  1. class Solution { 
  2. public
  3.     ListNode* findBeginning(ListNode *head){ 
  4.         ListNode *p = head, *q = head; 
  5.          
  6.         while (q -> next) { 
  7.             p = p -> next; 
  8.             q = q -> next -> next; 
  9.             if ( p == q) { 
  10.                 break
  11.             } 
  12.         } 
  13.          
  14.         if (!(q -> next)) { 
  15.             //no meeting point 
  16.             return NULL; 
  17.         } 
  18.          
  19.         p = head; 
  20.         while (p != q) { 
  21.             p = p -> next; 
  22.             q = q -> next; 
  23.         } 
  24.          
  25.         return p; 
  26.     } 
  27. }; 

你可能感兴趣的:(cc150)