微軟面試百題007 鍊錶相交

2021-07-16 12:10:26 字數 1218 閱讀 3967

給出倆個單向鍊錶的頭指標,比如h1,h2,判斷這倆個鍊錶是否相交。為了簡化問題,我們假設倆個鍊錶均不帶環。

問題擴充套件:

1.如何判斷鍊錶存在環

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

1.如何判斷鍊錶帶環

我們加入兩個指標,乙個快指標,乙個慢指標,快指標一次前進2個單位,慢指標一次前進乙個單位

如果不存在環的話快指標會先掃瞄到null

如果存在環的話,快指標總是會和慢指標相遇(有的人可能會疑惑會不會剛好錯過,仔細想一下會發現,沒有入環之前兩者距離不斷增加1,如幻之後兩者距離不斷縮短1,必然會相遇)

bool move(point* slow,point* fast)

if(fast==null) return 0;

else return 1;

}

2.如何快速判斷環的入口點:

數學表示式計算:

l——鍊錶的長度

a——煉表頭到環入口的距離

s——環入口到快慢指標相遇處距離

r——環長(r=l-a)

l-a-s——相遇處到環入口的距離

設慢指標走了k步,快指標走了2*k步

顯然:k=nr

a+s=k=nr=(n-1)r+r=(n-1)r+l-a

a=(l-a-s)+(n-1)r

根據上面的共識我們會發現,只要我們在鍊錶的開頭和相遇點之處再假設同步的指標,分別向後移動,可定會在環入口點相遇

point* find(point* head,point* meet)    //已經確認有環 

return head;

}

3.判斷是否鍊錶相交(相交後,之後的節點都是重合的)

1.最老的方法:o(n*n)選定乙個節點之後我們去遍歷另乙個節點,每一次都遍歷一遍,複雜度太高

2.將其中乙個鍊錶首尾相交,便利另乙個鍊錶如果可以掃瞄到已經相交的鍊錶的頭的話,說明相交,否則不相交

3.著第乙個相交點:計算兩個鍊錶的長度差,指標彌補長度差,同時開始同步移動

4.hash法:

通過遍歷一條鍊錶,將記憶體位址雜湊化,然後掃面另乙個倆表尋找就可以了(目前還真不會雜湊化記憶體位址)

我們怎麼做才可以把記憶體位址當作關鍵字自己設定雜湊函式來雜湊化,求教

LeeCode 面試02 07 鍊錶相交

給定兩個 單向 鍊錶,判定它們是否相交並返回交點。請注意相交的定義基於節點的引用,而不是基於節點的值。換句話說,如果乙個鍊錶的第k個節點與另乙個鍊錶的第j個節點是同一節點 引用完全相同 則這兩個鍊錶相交。示例 1 輸入 intersectval 8,lista 4,1,8,4,5 listb 5,0...

面試題02 07 鍊錶相交

題目大概練過leetcode的鍊錶部分估計都做過這道題 示例 1 輸入 intersectval 8,lista 4,1,8,4,5 listb 5,0,1,8,4,5 skipa 2,skipb 3輸出 reference of the node with value 8輸入解釋 相交節點的值為 ...

面試題 02 07 鍊錶相交

題目鏈結 給定兩個 單向 鍊錶,判定它們是否相交並返回交點。請注意相交的定義基於節點的引用,而不是基於節點的值。換句話說,如果乙個鍊錶的第k個節點與另乙個鍊錶的第j個節點是同一節點 引用完全相同 則這兩個鍊錶相交。示例 1 輸入 intersectval 8,lista 4,1,8,4,5 list...