判斷倆鍊錶是否相交

2021-06-18 04:00:06 字數 1758 閱讀 4560

給出倆個單向鍊錶的頭指標,比如h1,h2,判斷這倆個鍊錶是否相交。

為了簡化問題,我們假設倆個鍊錶均不帶環。

問題擴充套件:

1.如果鍊錶可能有環列?

2.如果需要求出倆個鍊錶相交的第乙個節點列?

建立hash表:

由於節點位址指標就是乙個整型,假設鍊錶都是在堆中動態建立的,可以使用堆的起始位址作為偏移量,以位址減去這個偏移量作為hash函式。

a、都無環。b、乙個有環乙個無環。c、都有環

b肯定不相交,故只需要討論a與c:若相交,則求交點。

環相交情況分為:環入口點不同、環入口點相同

上面第一種情況那個是第乙個交點呢?

當fast若與slow相遇時,slow肯定沒有走遍歷完鍊錶,而fast已經在環內迴圈了n圈(1<=n)。假設slow走了s步,則fast走了2s步(fast步數還等於s 加上在環上多轉的n圈),設環長為r,則:

2s = s + nr

s= nr

設整個鍊錶長l,入口環與相遇點距離為x,起點到環入口點的距離為a。

a + x = nr

a + x = (n – 1)r +r = (n-1)r + l - a

a = (n-1)r + (l – a – x)

(l – a – x)為相遇點到環入口點的距離,由此可知,從煉表頭到環入口點等於(n-1)迴圈內環+相遇點到環入口點

尋找環點的方法如下:

兩個指標,乙個走一步,乙個走兩步,在環中相遇位置為x。然後從頭節點和x位置,分別一步一步的走,每次判斷是否相遇,相遇點就是所求

環入口點

。當兩個鍊錶中有環時,相交的判斷:

(1)首先分別找出兩個鍊錶入環的第乙個結點記為p1,p2

(2)如果p1==p2,說明兩個鍊錶在入環之前或入環的第乙個結點相交;則此時可以轉為兩個鍊錶均不帶環相交的判斷,把p1,p2當作最後的末尾結點

(3)如果p1!=p2,此時兩個鍊錶可能完全不相交;也可能兩個鍊錶完全共有同乙個環。

當乙個鍊錶中有環,乙個鍊錶中沒有環時,兩個鍊錶必不相交。

一、判斷是否帶環

二、如果都不帶環,就判斷尾節點是否相等,記錄長度,找交點

三、乙個帶環、乙個不帶環,則無交點

四、都帶環,獲得其中一環入口點r1,然後將環斷開,判斷另鍊錶是否否是環,若不是環,說明兩環相交。此時變成了兩個無環的鍊錶求相交點。否則,兩環不相交。

//coder:lee

//20120307

#include

#include

using namespace std;

struct list

;list *isintersect(list *h1,list *h2)

int n2=1;

while(p2->next!=null)

if(p1!=p2)

return null;

int diff;

if(n1>n2)

else

while(h1!=h2)

return h1;

}list *isloop(list *h1)

return h1;}}

return null;

}void init(list *&p,int starti)

else}}

void print(list *p)

cout<

}list *findpoint(list *h1,list *h2)

else

return null;

}int main()

判斷倆鍊錶是否相交

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

判斷倆個鍊錶是否相交

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

判斷兩鍊錶是否相交

1.判斷鍊錶帶不帶環 2.如果都不帶環,就判斷尾節點是否相等 3.如果都帶環,判斷一條鍊錶上兩指標相遇的那個節點,在不在另一條鍊錶上,如果在,則相交,如果不在,則不相交 那麼如何判斷是否帶環?設定兩個指標 p1 p2 開始都指向鍊錶的頭,p2 每次移動兩步 p1每次移動一步,如果存在環,則他們必在環...