判斷兩鍊錶是否相交

2021-07-15 22:54:09 字數 1029 閱讀 1481

1.判斷鍊錶帶不帶環

2.如果都不帶環,就判斷尾節點是否相等

3.如果都帶環,判斷一條鍊錶上兩指標相遇的那個節點,

在不在另一條鍊錶上,如果在,則相交,如果不在,則不相交

那麼如何判斷是否帶環?

設定兩個指標 p1 、p2 開始都指向鍊錶的頭, p2 每次移動兩步

p1每次移動一步,如果存在環,則他們必在環中相遇

#include

#include

#include

typedef struct listnode

listnode;

listnode *head =

null;

/**如果鍊錶有環,則他就沒有尾節點,next的值不等於空

*/bool iscircle (listnode *head ,listnode *& circlenode ,listnode *& lastnode)

if(fast -> next ==

null)

if(slow -> next ==

null)

if(fast == slow && fast && slow)

else

fast = fast ->next;

slow = slow ->next;

}}/* 如果都不帶環,就判斷尾節點是否相等,如果都帶環,判斷一煉表上兩指標相遇的那個節點,在不在另

*外一條鍊錶上

*/bool detect(listnode *head1,listnode *head2)

//兩個都無環,判斷最後乙個節點是否相等

else

if(!iscircle1 &&

!iscircle2)

//兩個都有環,判斷環裡的節點是否在另乙個鍊錶環裡的節點

else

temp = temp ->next;

}return

false;

}return

false;

}

判斷兩個鍊錶是否相交

思路1 最暴力的辦法,針對鍊錶1的每乙個節點,判斷其是否也在鍊錶2中,複雜度o n m 明顯不是乙個好方法。思路2 給每個節點增加乙個標記量,可以是附在鍊錶中的成員,也可以是另外的乙個結構,例如用乙個陣列來儲存。先遍歷鍊錶1,標記出遍歷過的節點,再遍歷鍊錶2,如果發現某個節點已經被遍歷過,則說明相交...

判斷兩個鍊錶是否相交

參考 判斷兩個鍊錶是否相交 假設兩個鍊錶都沒有環 有以下三種方法 1 判斷第乙個鍊錶的每個節點是否在第二個鍊錶中 2 把第二個鍊錶連線到第乙個後面,判斷得到的鍊錶是否有環,有環則相交 3 先遍歷第乙個鍊錶,記住最後乙個節點,再遍歷第二個鍊錶,得到最後乙個節點時和第乙個鍊錶的最後乙個節點做比較,如果相...

判斷兩個鍊錶是否相交

判斷兩個鍊錶是否相交,程式設計之美 給出了以下方法 1.判斷第乙個鍊錶的每個節點是否在第二個鍊錶中,這種方法的時間複雜度為 o length h1 length h2 這種方法很耗時間 2.利用計數的方法 乙個簡單的做法是對第乙個鍊錶的結點位址進行hash排序,建立hash表,然後針對第二個鍊錶的每...