判斷兩個鍊錶是否相交,《程式設計之美》給出了以下方法:
1.判斷第乙個鍊錶的每個節點是否在第二個鍊錶中,這種方法的時間複雜度為:o(length(h1)*length(h2)),這種方法很耗時間
2.利用計數的方法 乙個簡單的做法是對第乙個鍊錶的結點位址進行hash排序,建立hash表,然後針對第二個鍊錶的每個節點的位址查詢hash表,如果它在雜湊表中出現,那麼說明第二個鍊錶和第乙個鍊錶有共同的結點,這個方法的時間複雜度為o(length(h1)+length(h2)),但是它同時需要附加o(length(h1))的儲存空間,以儲存雜湊表。 3.
由於兩個鍊錶都沒有環,我們可以把第二個鍊錶接在第乙個鍊錶後面,如果得到的鍊錶有環,則說明這兩個鍊錶相交。否則,這兩個鍊錶不相交。
4.先遍歷第乙個鍊錶,記住最後乙個結點,然後遍歷第二個鍊錶,到最後乙個節點時和第乙個鍊錶的最後乙個結點做比較,如果相同,則相交;否則,不相交。
本文針對鍊錶有環無環的情況,分別分析了判斷是否相交的方法。(1)如果兩個鍊錶都沒有環,使用《程式設計之美》給出的解法4,(2)如果兩個鍊錶,乙個有環,乙個沒有環,則這兩個鍊錶一定不相交(3) 如果兩個鍊錶都有環,則分別找到兩個鍊錶的環中的乙個結點n1和n2(找環中的結點的方法在下面有介紹)。遍歷第乙個鍊錶的環,看第二個鍊錶的環的某個結點n2是否出現在第乙個鍊錶的環中,如果出現,兩個有環鏈表是相交的,否則,兩個鍊錶是不相交的。
上面的情況(3)中需要找出有環鏈表的環中的某個結點,方法和判斷鍊錶有環的方法類似。判斷鍊錶有環的方法是:定義乙個快的指標,每次移動兩步,定義乙個慢的指標,每個移動一步,如果鍊錶有環,快的指標一定可以追上慢的指標,如果沒有環,則兩個指標沒有相遇的時刻。怎樣找出環中的某個結點,利用上面的快指標和慢指標,他們相遇的點必定在環中,相遇的時刻將這個結點返回,即可找到環中的乙個結點。
判斷鍊錶是否有環,程式為:
int hasloop(node *head)
return 0;
}
判斷有環的程式在下面會用到,判斷兩個鍊錶是否相交的程式為:
int isjoin(node *head1,node *head2)
else if(hasloop(head1)+hasloop(head2)==1) //兩個鍊錶有乙個有環,另外乙個沒有環,這時兩個鍊錶不相交
} fast=head2;
slow=head2;
while(fast&&fast->next) }
fast=entry1;
slow=entry1;
while(fast&&fast->next) //遍歷第乙個鍊錶的環,檢視entry2是否出現,若出現,則相交 }
return 0;
}}
判斷兩個鍊錶是否相交
思路1 最暴力的辦法,針對鍊錶1的每乙個節點,判斷其是否也在鍊錶2中,複雜度o n m 明顯不是乙個好方法。思路2 給每個節點增加乙個標記量,可以是附在鍊錶中的成員,也可以是另外的乙個結構,例如用乙個陣列來儲存。先遍歷鍊錶1,標記出遍歷過的節點,再遍歷鍊錶2,如果發現某個節點已經被遍歷過,則說明相交...
判斷兩個鍊錶是否相交
參考 判斷兩個鍊錶是否相交 假設兩個鍊錶都沒有環 有以下三種方法 1 判斷第乙個鍊錶的每個節點是否在第二個鍊錶中 2 把第二個鍊錶連線到第乙個後面,判斷得到的鍊錶是否有環,有環則相交 3 先遍歷第乙個鍊錶,記住最後乙個節點,再遍歷第二個鍊錶,得到最後乙個節點時和第乙個鍊錶的最後乙個節點做比較,如果相...
判斷兩個鍊錶是否相交
給出兩個單行鍊錶的頭指標 判斷這兩個鍊錶是否相交 為了簡化 這裡假設兩個鍊錶均不帶環 方法1 判斷第乙個鍊錶的每個節點是否在第二個鍊錶中 這種方法的時間複雜度為o lenth l1 lenth l2 方法2 如果兩個鍊錶相交 那麼這兩個鍊錶就會有共同的節點 而節點位址又是節點的唯一標識 所以我們能夠...