給出倆個單向鍊錶的頭指標,比如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 *p1=isloop(h1);
list *p2=isloop(h2);
if(p1==null&&p2==null)//都不帶環
return isintersect(h1,h2);
else if (p1!=null && p2!=null)//都帶環
else
return null;
}int main()
判斷倆鍊錶是否相交
給出倆個單向鍊錶的頭指標,比如h1,h2,判斷這倆個鍊錶是否相交。為了簡化問題,我們假設倆個鍊錶均不帶環。問題擴充套件 1.如果鍊錶可能有環列?2.如果需要求出倆個鍊錶相交的第乙個節點列?建立hash表 由於節點位址指標就是乙個整型,假設鍊錶都是在堆中動態建立的,可以使用堆的起始位址作為偏移量,以位...
判斷倆個鍊錶是否相交
程式設計之美 上的一道微軟亞院題,判斷兩個兩個鍊錶是否相交,難度係數低。描述如下 給出倆個單向鍊錶的頭指標,比如h1,h2,判斷這倆個鍊錶是否相交。為了簡化問題,我們假設倆個鍊錶均不帶環。問題擴充套件 1.如果鍊錶可能有環列?2.如果需要求出倆個鍊錶相交的第乙個節點列?邏輯分析 1 先考慮不帶環的鍊...
判斷兩鍊錶是否相交
1.判斷鍊錶帶不帶環 2.如果都不帶環,就判斷尾節點是否相等 3.如果都帶環,判斷一條鍊錶上兩指標相遇的那個節點,在不在另一條鍊錶上,如果在,則相交,如果不在,則不相交 那麼如何判斷是否帶環?設定兩個指標 p1 p2 開始都指向鍊錶的頭,p2 每次移動兩步 p1每次移動一步,如果存在環,則他們必在環...