【演算法面試題】求兩個相交鏈表的首個相交節點

來源:互聯網
上載者:User

http://geeksforgeeks.org/?p=2405

 

 

有兩個單向鏈表A和B如所示,他們相交於某個節點(在這個例子裡為15),寫一個程式把第一個交點找出來:

 

 

方法1:利用兩次迴圈

foreach nodeA in listA

   foreach nodeB in listB

      if nodeB == nodeA

         then A and B intersect at the current node, i.e., nodeA (or equivalently nodeB)

 

假設鏈表A的長度是m,鏈表B的長度是n,這個演算法的複雜度是O(mn),不太理想。

 

 

方法2:標記已經訪問的節點

 

首先對每個節點添加一個標誌位bVisited,表示這個節點有沒有被訪問過,初始為false。

 

然後遍曆鏈表A,把A中的每個節點標識為已訪問過(設定bVisited=true);然後遍曆鏈表B,在遍曆的過程中,如果發現有一個已經訪問過的節點,則證明此節點為A和B的交點。

 

這個演算法的複雜度是O(m+n),比方法1好,但是這個方法需要為每個節點添加一個標誌位。一種變通的方法是,利用Hash表記錄一個節點是否已經被訪問過。

 

 

方法3:利用A和B節點數目之差

 

觀察本文開始給的圖示,我們可以看到如果兩個鏈表A和B相交,他們將呈現一個Y字形,我們利用A和B的節點數目之差就可以判斷他們在什麼地方相交了,步驟如下:

 

1)計算出鏈表A的節點數目,記做c1;

2)計算出鏈表B的節點數目,記做c2;

3)算出節點數目之差:d = abs(c1 - c2);

4)現在從節點數較多的鏈表開始,從頭往前走過d個節點,從此節點往前走,兩個鏈表有相同數目的節點。

5)此時我們可以同時遍曆兩個鏈表直到找到一個交點。

 

這個演算法的複雜度是O(m+n),是推薦使用的方法。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.