7 微軟亞院之程式設計判斷倆個鍊錶是否相交(鍊錶)

2021-06-16 09:09:06 字數 1340 閱讀 7611

今天看了july的一篇經典文章《程式設計師程式設計藝術:第九章、閒話鍊錶追趕問題》,因為現在一直複習資料結構有關鍊錶的演算法,順便總結下,學習下july大牛的判斷鍊錶是否相交。出處:

題目:給出兩個單向鍊錶的頭指標,判斷是否相交。

下面是july文章上面的解法:

分析:這是來自程式設計之美上的微軟亞院的一道面試題目。請跟著我的思路步步深入(部分文字引自程式設計之美):

直接迴圈判斷第乙個鍊錶的每個節點是否在第二個鍊錶中。但,這種方法的時間複雜度為o(length(h1) * length(h2))。顯然,我們得找到一種更為有效的方法,至少不能是o(n^2)的複雜度。

針對第乙個鍊錶直接構造hash表,然後查詢hash表,判斷第二個鍊錶的每個結點是否在hash表出現,如果所有的第二個鍊錶的結點都能在hash表中找到,即說明第二個鍊錶與第乙個鍊錶有相同的結點。時間複雜度為為線性:o(length(h1) + length(h2)),同時為了儲存第乙個鍊錶的所有節點,空間複雜度為o(length(h1))。是否還有更好的方法呢,既能夠以線性時間複雜度解決問題,又能減少儲存空間?

進一步考慮「如果兩個沒有環的鍊錶相交於某一節點,那麼在這個節點之後的所有節點都是兩個鍊錶共有的」這個特點,我們可以知道,如果它們相交,則最後乙個節點一定是共有的。而我們很容易能得到鍊錶的最後乙個節點,所以這成了我們簡化解法的乙個主要突破口。那麼,我們只要判斷倆個鍊錶的尾指標是否相等。相等,則鍊錶相交;否則,鍊錶不相交。

所以,先遍歷第乙個鍊錶,記住最後乙個節點。然後遍歷第二個鍊錶,到最後乙個節點時和第乙個鍊錶的最後乙個節點做比較,如果相同,則相交,否則,不相交。這樣我們就得到了乙個時間複雜度,它為o((length(h1) + length(h2)),而且只用了乙個額外的指標來儲存最後乙個節點。這個方法時間複雜度為線性o(n),空間複雜度為o(1),顯然比解法三更勝一籌。

上面的問題都是針對鍊錶無環的,那麼如果現在,鍊錶是有環的呢?還能找到最後乙個結點進行判斷麼?上面的方法還同樣有效麼?顯然,這個問題的本質已經轉化為判斷鍊錶是否有環。那麼,如何來判斷鍊錶是否有環呢?

總結:

所以,事實上,這個判斷兩個鍊錶是否相交的問題就轉化成了:

1.先判斷帶不帶環

2.如果都不帶環,就判斷尾節點是否相等

3.如果都帶環,判斷一煉表上倆指標相遇的那個節點,在不在另一條鍊錶上。

如果在,則相交,如果不在,則不相交。

下面先給出是否有環的演算法,就使用前面我的文章中的方法,但是題目的需要,增加了儲存了尾節點。

演算法和july的方法是一樣的,但是實現的方式有點不同而已。

7 微軟亞院之程式設計判斷倆個鍊錶是否相交

給出倆個單向鍊錶的頭指標,比如h1,h2,判斷這倆個鍊錶是否相交。為了簡化問題,我們假設倆個鍊錶均不帶環。問題擴充套件 1.如果鍊錶可能有環列?2.如果需要求出倆個鍊錶相交的第乙個節點列?handwriting question bool intersect node h1,node h2 ques...

判斷倆個鍊錶是否相交

程式設計之美 上的一道微軟亞院題,判斷兩個兩個鍊錶是否相交,難度係數低。描述如下 給出倆個單向鍊錶的頭指標,比如h1,h2,判斷這倆個鍊錶是否相交。為了簡化問題,我們假設倆個鍊錶均不帶環。問題擴充套件 1.如果鍊錶可能有環列?2.如果需要求出倆個鍊錶相交的第乙個節點列?邏輯分析 1 先考慮不帶環的鍊...

判斷倆鍊錶是否相交

給出倆個單向鍊錶的頭指標,比如h1,h2,判斷這倆個鍊錶是否相交。為了簡化問題,我們假設倆個鍊錶均不帶環。問題擴充套件 1.如果鍊錶可能有環列?2.如果需要求出倆個鍊錶相交的第乙個節點列?建立hash表 由於節點位址指標就是乙個整型,假設鍊錶都是在堆中動態建立的,可以使用堆的起始位址作為偏移量,以位...