判斷兩個單鏈表是否相交 ,並返回第乙個相交的元素。
思路
可以想到,如果兩個鍊錶相交,那麼它肯定是尾部相連,首部分開,就像朝左側臥的「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的使用者,可能並不知道事實的真相,這會帶來很大的麻煩。...