判斷兩個單鏈表是否相交及找到第乙個交點

2021-10-05 11:58:29 字數 1602 閱讀 2277

參考如何判斷兩個鍊錶是否相交?

大概就是乙個y字形

解法:

設煉表a 的長度為 a + c,鍊錶b 的長度為 b + c,其中 c 為尾部公共部分長度,可知 a + c + b = b + c + a。

a、b鍊錶 同時從頭部出發。當訪問鍊錶 a 的指標訪問到鍊錶尾部時,令它從鍊錶 b 的頭部重新開始訪問鍊錶 b;同樣地,當訪問鍊錶 b 的指標訪問到鍊錶尾部時,令它從鍊錶 a 的頭部重新開始訪問鍊錶 a。這樣當訪問到藍色節點時,兩個指標會同時指向藍色節點(a+c+b=b+c+a)。

public listnode findfirstcommonnode

(listnode phead1, listnode phead2)

return l1;

}

設定兩個鍊錶指標fast, slow,初始值都指向煉表頭結點,然後兩個指標都往後走,不同的是slow每次前進一步,即前進乙個節點。fast每次前進兩步,如果存在環,兩個指標必定相遇。

上圖可以看出,當slow指標後移4次後會處在5號節點的位置。fast指標後移8次以後也會處在5號節點的位置。由此可以判斷該鍊錶是有環的。

從上圖中可以知道鍊錶有環,快慢指標一定相遇(不為空的相遇)。但是相遇點一定是入口點嗎?

答案是不一定

那麼如果找到入口點呢?

從上圖可以看出快慢指標在五號節點相遇。頭結點距離2號節點(入口點)為1,5號節點距離2號節點的距離也為1。此時重新找乙個節點從頭結點開始遍歷,另外乙個節點從5號節點開始遍歷,當兩個節點相遇的時候就是入口節點。

為什麼這樣呢?應該是乙個數學公式吧,這個我也沒搞懂,但是測試的都通過

public listnode entrynodeofloop

(listnode phead)

while

(slow != fast)

;//找到相遇點

if(slow==null)

//如果相遇點為null,那麼就意味著沒有環

針對上面的前兩種情況:

鍊錶有環,我們可以根據鍊錶有環而找出環的入口。也就是找到前兩種情況的p點。然後根據無環鏈表的解法(檢視文章目錄)就可以找出交點。

針對上面的第三種情況:

我們可以分別找到鍊錶一和鍊錶二的環入口節點,各自的環入口節點即為各自第一次相交的節點。

判斷兩個鍊錶是否相交

cyc

判斷兩個單鏈表是否相交

首先要搞清楚單鏈表相交的概念和特點 指的是他們存在完全重合的部分,不是交叉到乙個點 不存在這種情況,可以想想為什麼 判斷其是否相交的方法有以下幾種。1 最傳統方法 雙重迴圈,依次查詢,是否有位址相同的節點,時間複雜度o list1.len list2.len 空間複雜度o 1 2 hash法 先遍歷...

判斷兩個單鏈表是否相交

方法一 直接法 直接判斷第乙個鍊錶的每個結點是否在第二個鍊錶中,時間複雜度為o len1 len2 耗時很大 方法二 利用計數 如 果 兩個鍊錶相交,則兩個鍊錶就會有共同的結點 而結點位址又是結點唯一標識。因而判斷兩個鍊錶中是否存在位址一致的節點,就可以知道是否相交了。可以對第一 個鍊錶的節點位址進...

判斷兩個單鏈表是否相交

判斷兩個單鏈表是否相交,如果相交,給出相交的第乙個點 兩個鍊錶都不存在環 比較好的方法有兩個 一 將其中乙個鍊錶首尾相連,檢測另外乙個鍊錶是否存在環,如果存在,則兩個鍊錶相交,而檢測出來的依賴環入口即為相交的第乙個點。二 如果兩個鍊錶相交,那個兩個鍊錶從相交點到鍊錶結束都是相同的節點,我們可以先遍歷...