每日一題 判斷兩個鍊錶相交

2021-10-08 03:48:14 字數 1322 閱讀 6342

判斷兩個單鏈表是否相交 ,並返回第乙個相交的元素。

思路

可以想到,如果兩個鍊錶相交,那麼它肯定是尾部相連,首部分開,就像朝左側臥的「y」形。因此,能夠想到兩種思路,一種是從後往前遍歷鍊錶,直到兩個鍊錶的某個結點元素值不相等,那這個結點的前乙個結點就是第乙個相交的結點。另外一種思路就是從前往後遍歷,首先拿到兩個鍊錶的長度,將兩個鍊錶的長度差記錄下來,長鍊表先走長度差步,然後長短鍊錶再一起走,直到遇到兩個鍊錶的結點值相等,即為第乙個相交的結點。具體梳理如下:

思路一:用兩個棧儲存兩個鍊錶的結點,然後依次比較兩個棧頂結點,若相同則說明相交,直到兩個結點不同,則說明這個結點的前乙個結點是第乙個相交的結點。  

思路二:依次遍歷兩個鍊錶,記錄長度,然後讓長鍊表先走長度差步,兩煉表再同時走,直到兩個結點相同,則為第乙個相交的結點。

**實現

//鍊錶結點

struct listnode};

//思路一

listnode*

findfirstcommonnode

(listnode *heada, listnode *headb)

while

(curb!=

nullptr

)int n =0;

int size = sa.

size()

;while

(!sa.

empty()

&&!sb.

empty()

)}n = size-n;

while

(n--

)return heada;

}//思路二

listnode*

findfirstcommonnode

( listnode* phead1, listnode* phead2)

while

(pcur2 !=

nullptr

) listnode* plong =

nullptr

; listnode* pshort =

nullptr

;int k =0;

if(len1 > len2)

else

while

(k--

)while

(plong-

>next !=

nullptr

&& plong != pshort)

if(plong == pshort)

return

nullptr

;}

如何判斷兩個鍊錶相交

方法一 最笨的方法,遍歷鍊錶1,每遍歷乙個節點,判斷這個節點是否在鍊錶2中 for node1 in l1 for node2 in l2 if node1 node2 return true 時間複雜度比較高,o l1.length l2.length 方法二 萬能的hash,對於節點位址進行ha...

每日一題 4 鍊錶相交問題

判斷兩個鍊錶是否相交,若相交,求交點。假設鍊錶不帶環 pnode iscrosswithcircle pnode phead1,pnode phead2 else while pcur pret return pcur 判斷兩個鍊錶是否相交,若相交,求交點。假設鍊錶可能帶環 公升級版 int che...

如何判斷兩個鍊錶相交及找到第乙個相交點

我們學乙個演算法,一定是為了用吧,所謂 學以致用 嗎?那麼判斷兩個鍊錶是否相交有什麼用呢?這是因為一旦兩個鍊錶出現相交的情況,就可能發生這樣的情況,程式釋放了鍊錶la的所有節點,這樣就導致了另外乙個與之有相交節點的鍊錶lb中的節點也釋放了,而lb的使用者,可能並不知道事實的真相,這會帶來很大的麻煩。...