程式設計判斷兩個鍊錶是否相交

2021-06-28 03:59:58 字數 1778 閱讀 1957

《程式設計之美》3.6節:判斷兩個鍊錶是否相交

問題:給出兩個單項鍊表的頭指標,判斷這兩個鍊錶是否相交,假設都不帶環。

解法:遍歷第乙個鍊錶至尾節點,然後遍歷第二個鍊錶,如果尾節點和剛才相同,則說明相交,否則不想交。

**:#includeusing namespace std;

struct node

};bool iscrosslist(node *firstlist,node *secondlist)

int main()

node *secondlist=new node(0);

curr=secondlist;

for(int i=1;i<5;i++)

curr->next=cross;

bool result=iscrosslist(firstlist,secondlist);

cout《擴充套件問題一:如果鍊錶可能有環,上面**如何修改?

解法:先找出第乙個鍊錶的環的入口節點first,然後找出第二個鍊錶的環的入口節點second,如果相同,則肯定相交。如果不相同則令curr=second->next,然後curr!=second,即遍歷一遍第二個鍊錶的環,如果有curr==first,則證明相交,否則不想交。

擴充套件問題二:求出兩個鍊錶相交的第乙個節點?

解法:分兩種情況,一種是沒有環,兩鍊錶相交,把鍊錶尾節點的下乙個節點指向第二個鍊錶的頭結點,那麼這個問題便轉換成了求乙個帶環鍊錶的環的入口節點。第二種情況是兩煉表有環且相交,此時求出兩個鍊錶分別的環的入口節點first和second,如果不相同則第二個鍊錶的入口節點就是所求;如果相同,則把first->next=nullptr,即把鍊錶的環斷開,然後根據無環的相交鍊錶求相交的節點即可,即情況一。

**:#includeusing namespace std;

struct node

};bool hasloop(node *head)

return false;

}node * firstcrossnode(node *head)

slow=slow->next;

fast=fast->next->next;

} while(slow!=fast)

return slow;

}bool iscrosslistnoloop(node *firstlist,node *secondlist)

bool iscrosslisthasloop(node *firstlist,node *secondlist)

return false;

}bool iscrosslist(node *firstlist,node *secondlist)

node *twolistfirstcrossnodenoloop(node *firstlist,node *secondlist)

node *twolistfirstcrossnodehasloop(node *firstlist,node *secondlist)

}node *twolistfirstcrossnode(node *firstlist,node *secondlist)

int main()

curr->next=cross->next->next;

node *secondlist=new node(0);

curr=secondlist;

for(int i=1;i<5;i++)

curr->next=cross;

bool result=iscrosslist(firstlist,secondlist);

cout

判斷兩個鍊錶是否相交

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

判斷兩個鍊錶是否相交

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

判斷兩個鍊錶是否相交

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