1. 程式人生 > >判斷兩個連結串列是否交叉,並求出交叉點

判斷兩個連結串列是否交叉,並求出交叉點

有兩個單向連結串列,表頭pHeader1,pHeader2,請寫一個函式判斷這兩個連結串列是否有交叉.如果有交叉,給出交叉點.程式不能改變連結串列的內容,可以使用額外的空間,時間複雜度儘量小,最好給出兩種解.(雙重迴圈的解由於時間複雜度高,不算正解).

基本思想:如果兩個連結串列交叉,那麼這兩個連結串列在交叉點之後的節點是完全相同的!!

因此可以用一下的演算法判斷兩個連結串列是否交叉
1. 分別得到兩個連結串列的最後一個節點,以及連結串列的長度.
2. 如果2個連結串列的最後一個節點地址相同,則有交叉,否則執行3
3. 假設兩個連結串列的長度分別是m和n,且m>=n,那麼移動長的那個連結串列,先移動m-n個節點,是長連結串列與短連結串列在末端對齊,然後從對其的節點開始比較兩個連結串列,如果不相等,就都向後移動一格.(注意這裡是兩個連結串列的指標同時向後移動)直到相等,相等的節點就是交叉點.
4. 時間複雜度O(n+m).