判斷兩個鍊錶是否相交,若相交,求交點。(假設鍊錶不帶環)
判斷兩個鍊錶是否相交,若相交,求交點。(假設鍊錶可能帶環)
採用對齊的思想。計算兩個鍊錶的長度 l1 , l2,分別用兩個指標 p1 , p2 指向兩個鍊錶的頭,然後將較長鍊錶的 p1(假設為 p1)向後移動l2 - l1個節點,然後再同時向後移動p1 , p2,直到 p1 = p2。相遇的點就是相交的第乙個節點。
pnode checkcircle(plist plist)//判斷鍊錶是否有環
}return null;
}int circlelength(plist plist)//求環的長度
while (cur == tmp);
return count;
}pnode findnode(plist plist)//碰撞點
//碰撞點p到連線點的距離=頭指標到連線點的距離,因此,分別從碰撞點、頭指標開始走,相遇的那個點就是連線點。
return tmp;
}int circlelistlength(plist plist)//求環的長度
return count + circlelength(plist);
}bool checknocirclecross(plist plist1, plist plist2)//判斷兩個鍊錶是否相交
while (plist2->next)
if (plist1 == plist2)
else
return false;
}int listlength(plist plist)
return count;
}pnode findnocircleintersectnode(plist plist1, plist plist2)//查詢相交節點
}else
}while (plist1 != null)
plist1 = plist1->next;
plist2 = plist2->next;
}return null;
}pnode findintersectnode(plist plist1, plist plist2)// 查詢交點(不知是否有環)
if (checkcircle(plist1) && (!checkcircle(plist2)))
if (checkcircle(plist2) && (!checkcircle(plist1)))
int l1 = circlelistlength(plist1);
int l2 = circlelistlength(plist2);
if (l1 > l2)
}if (l1 < l2)
}while (plist1)
plist1 = plist1->next;
plist2 = plist2->next;
}}
鏈表面試題 判斷鍊錶是否相交(c語言)
一 問題描述 判斷兩個鍊錶是否相交,若相交返回交點,否則返回空。這裡假設鍊錶不帶環 由上圖我們可以得出鍊錶相交的兩個結論 1.兩鍊錶相交,第乙個相同的結點為鍊錶的交點 2.兩鍊錶相交,從交點向後的所有結點都相同 合二為一 二 解決思路 方法一 直觀法 思路 依次判斷第乙個鍊錶中的每個結點是否在第二個...
面試題 判斷兩個鍊錶是否相交(可能帶環)
判斷兩個鍊錶是否相交 可能帶環 這個問題我們可以根據是否帶環來分三種情況,情況一 兩個鍊錶都不帶環 情況二 其中有乙個鍊錶帶環 情況三 兩個鍊錶都帶環。下面我用一張來進行更詳細的分類,之後寫 也是按照這種劃分思想。bool isloop node phead 判斷乙個鍊錶是否帶環 if fast n...
面試題 判斷鍊錶是否相交
今天看了 july的一篇經典文章 程式設計師程式設計藝術 第九章 閒話鍊錶追趕問題 因為現在一直複習資料結構有關鍊錶的演算法,順便總結下,學習下july大牛的判斷鍊錶是否相交。出處 題目 給出兩個單向鍊錶的頭指標,判斷是否相交。下面是july文章上面的解法 分析 這是來自程式設計之美上的微軟亞院的一...