給定一個有環鏈表,實現一個算法返回環路的開頭結點

  1. 因爲若是兩個鏈表若是相交,那麼交點以後node都是共享(地址相同)的,所以最簡單暴力的方法就是兩個for循環,判斷該鏈表的node是否屬於另一個鏈表。可是這個算法複雜度是O(length1 * length2)。若是鏈表較長,這個複雜度有點高了。node

    固然也能夠遍歷其中某個鏈表,將node的地址存儲hash table中;而後接下來遍歷另一個鏈表,查找node是否在這個hash table中。這樣的話時間複雜度就是O(length1 + length2)。可是須要額外的O(length1)的空間。算法

  2.  
  3.  
  4. /** 
  5.  * 功能:給定一個有環鏈表,實現一個算法返回環路的開頭結點。 
  6.  */  
  7.   
  8.       /** 
  9.        * 思路:fast的移動速度是slow的兩倍。當slow走了k個結點進入環路,fast已經進入環路k個結點,即fast和slow 
  10.        * 相距loop_size -k個結點。 
  11.        *          再走loop_ -k次後,碰撞,此時距離環路起始處k個結點。 
  12.        *          鏈表首部與環路起始處均距離環路起始處k個結點。所以,保持其中一個不變,另外一個指向鏈表首部,相會處 
  13.        *    即爲環路起始處。 
  14.        * 
  15.        * 算法: 
  16.        * 1)建立兩個指針,fast和slow。 
  17.        * 2)slow每走一步,fast走兩步。 
  18.        * 3)碰撞時,將slow指向head,fast保持不變。 
  19.        * 4)相同速度移動fast和slow,一次一步,返回碰撞結點。 
  20.        * @param head 
  21.        * @return 
  22.        */  
  23.       public static LinkedListNode findBeginging(LinkedListNode head){  
  24.             LinkedListNode slow= head;  
  25.             LinkedListNode fast= head;  
  26.               
  27.              while( fast!= null&& fast. next!= null){  
  28.                    slow= slow. next;  
  29.                    fast= fast. next. next;  
  30.                    if( slow!= fast)  
  31.                          break;  
  32.             }  
  33.               
  34.              if( fast== null|| fast. next== null)  
  35.                    return null;  
  36.               
  37.              slow= head;  
  38.              while( slow!= fast){  
  39.                    slow= slow. next;  
  40.                    fast= fast. next;  
  41.             }  
  42.               
  43.              return fast;  
  44.       }
相關文章
相關標籤/搜索