如何判斷兩個單向鍊錶是否有相交,並找出交點

2021-07-22 23:25:35 字數 1572 閱讀 1639

判斷兩個鍊錶是否相交:(假設兩個鍊錶都沒有環)

1、判斷第乙個鍊錶的每個節點是否在第二個鍊錶中

2、把第二個鍊錶連線到第乙個後面,判斷得到的鍊錶是否有環,有環則相交

3、先遍歷第乙個鍊錶,記住最後乙個節點,再遍歷第二個鍊錶,得到最後乙個節點時和第乙個鍊錶的最後乙個節點做比較,如果相同,則相交

如何判斷乙個單鏈表是有環的?(注意不能用標誌位,最多只能用兩個額外指標)

一種o(n)的辦法就是(用兩個指標,乙個每次遞增一步,乙個每次遞增兩步,如果有環的話兩者必然重合,反之亦然):

bool check(const node* head)

return

false;

}

擴充套件問題參考:

擴充套件1:如果鍊錶可能有環,則如何判斷兩個鍊錶是否相交

思路:鍊錶1 步長為1, 鍊錶2步長為2 ,如果有環且相交則肯定相遇,否則不相交

list1 head: p1

list2 head: p2

while( p1 != p2 && p1 !=

null

&& p2 !=

null )

if ( p1 == p2 && p1 && p2) //相交

else

//不相交

擴充套件2:求兩個鍊錶相交的第乙個節點

思路:在判斷是否相交的過程中要分別遍歷兩個鍊錶,同時記錄下各自長度。

node* step( node* p, node* q)

while( q->next )

result = ( p == q );

if ( result )

plen > qlen ? p = head : q = head;

while ( p != q )

reutrn p;

}return null;

}

深信服一道筆試:如何判斷兩個單向鍊錶是否有相交,並找出交點。

題比較簡單,單向鍊錶有交點意思就是交點後的節點都是一樣的了。

node* findnode(node* phead1, node* phead2)

while(p1->next != null)

while(p2->next != null)

if(p1 != p2)

else

while(p1 != p2)

return p1;

}else

while(p1 != p2)

return p1;}}

}

1,在第一次遍歷完煉表後,進行第二次遍歷,需要把指標再次初始化;看見網上一些人給的例子沒有再次初始化顯然是錯誤的;再呼叫null的next不死才怪!

2,小優化。迴圈和判斷,把判斷放在外面;如果把i和j大小判斷放在裡面的話就意味著迴圈多少次,判斷就執行多少次;當然這樣做的唯一不足就是** 多了點;還有for迴圈之前的對f的賦值,有的為了簡便直接放在for語句裡面,不過同樣道理,放在for迴圈裡面,就執行了n次的fabs;拿出來賦 值,只賦值一次就ok。

判斷兩個單向鍊錶是否相交

鍊錶分為有環和無環,如果兩個鍊錶存在相交,則只有兩種可能,兩個鍊錶都無環或者都有環。下面分別討論。2.1定義鍊錶 單向鍊錶 public static class linknode 2.2判斷是否有環 判斷是否有環,有環返回入口點,無環返回null。public static linknode is...

判斷兩個單向鍊錶是否相交

給定兩個 單向 鍊錶,判定它們是否相交並返回交點。請注意相交的定義基於節點的引用,而不是基於節點的值。換句話說,如果乙個鍊錶的第k個節點與另乙個鍊錶的第j個節點是同一節點 引用完全相同 則這兩個鍊錶相交。首先最容易想到暴力搜尋,對a鏈的每乙個節點,都對b鍊錶進行遍歷搜尋看是否相同 public li...

六 判斷兩個單向鍊錶是否相交

判斷兩個單向鍊錶是否相交,有兩種情況,一種是兩個不帶環的單向鍊錶相交,一種是兩個帶環的單向鍊錶相交。情況1 兩個不帶環的單向鍊錶相交 判斷兩個不帶環的單向鍊錶是否相交。時間複雜度o n 空間複雜度o 1 思路 如果兩個沒有環的鍊錶相交於某一節點,那麼在這個節點之後的 所有節點都是兩個鍊錶共有的,如果...