1.分析:在已知鍊錶不帶環時,如果兩個鍊錶的尾部相同則相交,用快慢指標求交點。
listnode* getmeetnode(listnode* list1,listnode* list2)//判斷相交點
while(cur2)
listnode* longlist = list1;
listnode* shortlist = list2;
if(len1 < len2)
int gap = abs(len1-len2);
while(gap--)
while(longlist)
longlist = longlist->next;
shortlist = shortlist->next;
}return null;
}
2.分析:判斷l1和l2是否帶環
a.l1和l2都不帶環,求鍊錶的尾是否帶環,求交點
b.l1帶環,l2不帶環或l1不帶環,l2帶環。則l1和l2一定不相交
c.l1和l2都帶環
1)入口點在環外—>交點+入口點
2)入口點在環內—>兩個點即是交點又是入口點
3)帶環不相交
listnode* istersect(listnode* plist1, listnode* plist2)//判斷鍊錶是否相交公升級版
listnode* enter1 = enternode(plist1);
listnode* enter2 = enternode(plist2);
//1.若兩個鍊錶都無環,則直接用題目二的函式解決
if ((enter1 == null) && (enter2 == null))
//2.若乙個有環,乙個無環,則不想交,返回null
else if ((enter1 == null) && (enter2 != null) || (enter1 != null) && (enter2 == null))
若入口點相同都在尾巴,去掉環,轉化成無環相交問題
else if (enter1 == enter2)
同環,兩個入口點 乙個入口點開始遍歷一圈,看環上是否有另乙個入口點
// 找到則返回plist1的入口點
else
tmp = tmp->next;
} return null;
} }
兩個相交鍊錶
兩個單鏈表相交的一系列問題 題目 在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1和head2,這兩個鍊錶可能相交,也可能 不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回null 即可。要求 如果鍊錶1 的長度為n,鍊錶2的長度為m,時間複...
判斷兩個鍊錶是否相交
思路1 最暴力的辦法,針對鍊錶1的每乙個節點,判斷其是否也在鍊錶2中,複雜度o n m 明顯不是乙個好方法。思路2 給每個節點增加乙個標記量,可以是附在鍊錶中的成員,也可以是另外的乙個結構,例如用乙個陣列來儲存。先遍歷鍊錶1,標記出遍歷過的節點,再遍歷鍊錶2,如果發現某個節點已經被遍歷過,則說明相交...
判斷兩個鍊錶是否相交
參考 判斷兩個鍊錶是否相交 假設兩個鍊錶都沒有環 有以下三種方法 1 判斷第乙個鍊錶的每個節點是否在第二個鍊錶中 2 把第二個鍊錶連線到第乙個後面,判斷得到的鍊錶是否有環,有環則相交 3 先遍歷第乙個鍊錶,記住最後乙個節點,再遍歷第二個鍊錶,得到最後乙個節點時和第乙個鍊錶的最後乙個節點做比較,如果相...