《程式設計之美》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表,然後針對第二個鍊錶的每...判斷兩個鍊錶是否相交
判斷兩個鍊錶是否相交
判斷兩個鍊錶是否相交