這個問題是分好幾種情況的,要分支來判斷:
假定兩個單鏈表分別為鍊錶a和鍊錶b,則:
1.a無環,b無環,存在以下三種情況:
2.a有環,b無環(a無環,b有環亦然),存在一種情況:
3.a有環,b有環,則存在三種情況:
判斷乙個單向是否有環的方法:從該煉表頭指標開始,設定兩個指標,乙個快指標,乙個慢指標。快指標每次沿著鍊錶走兩個鏈節,慢指標每次沿著鍊錶走乙個鏈節,當兩個指標指向同乙個鏈節時(即兩個指標相等),說明鍊錶有環;當快指標指向null時,說明鍊錶無環。
對於情況1:
分別遍歷得到兩個鍊錶的長度,並且在遍歷的時候,比較兩個鍊錶的終節點,如果不同,則是(2);如果相同,則為(1)或(3).
對(1)(3),取鍊錶節點數的差值,將長鍊錶從差值處開始遍歷,短節點從頭結點開始遍歷,比較兩個節點是否相等,不相等繼續向下遍歷,直至相等找到相交節點。
對於情況2:
直接得出結論,二者不相交。
對於情況3:
判斷a有環的因為快慢指標指向了同乙個節點,記為交點a,b的記為交點b。從交點a放出乙個慢指標,每次沿煉錶走乙個鏈節;交點b放出乙個快指標,每次沿著鍊錶走
兩個鏈節。當兩個指標相交,則說明a、b共用乙個環,情形為(2)或(3);當a的慢指標走回交點a,兩個指標仍然沒相交,說明情況為(1).
對(2)(3),將交點a的next指向null,斷開環路然後按照1(3)中的線性查詢方法去找相交節點,一定能找到乙個交點c。
我們將交點a的next復原,從交點c開始遍歷,找到交點c的前節點,讓交點c前節點的next指向null,這個時候能夠找到交點d。當交點c與交點d相同時,為情況(2);不
相等時為情況(3).
兩個單向鍊錶是否相交 彙總
這個問題是分好幾種情況的,要分支來判斷 假定兩個單鏈表分別為鍊錶a和鍊錶b,則 1.a無環,b無環,存在以下三種情況 2.a有環,b無環 a無環,b有環亦然 存在一種情況 3.a有環,b有環,則存在三種情況 判斷乙個單向是否有環的方法 從該煉表頭指標開始,設定兩個指標,乙個快指標,乙個慢指標。快指標...
判斷兩個單向鍊錶是否相交
鍊錶分為有環和無環,如果兩個鍊錶存在相交,則只有兩種可能,兩個鍊錶都無環或者都有環。下面分別討論。2.1定義鍊錶 單向鍊錶 public static class linknode 2.2判斷是否有環 判斷是否有環,有環返回入口點,無環返回null。public static linknode is...
判斷兩個單向鍊錶是否相交
給定兩個 單向 鍊錶,判定它們是否相交並返回交點。請注意相交的定義基於節點的引用,而不是基於節點的值。換句話說,如果乙個鍊錶的第k個節點與另乙個鍊錶的第j個節點是同一節點 引用完全相同 則這兩個鍊錶相交。首先最容易想到暴力搜尋,對a鏈的每乙個節點,都對b鍊錶進行遍歷搜尋看是否相同 public li...