題目:兩個較長的單向鏈表a和b,爲了找出節點node滿足node in a 並且node in b。請設計空間使用盡量小的算法(用c/c++,java 或者僞代碼)
思路:我們定義節點的距離爲節點到鏈表開始所經過的節點數。如果兩個鏈表長度相同,則相交節點其在兩個鏈表上的距離一定相等。對於長度不同的兩個鏈表,我們可以採用對齊的方式,使其向長度短的鏈表對齊。這樣就可以應用上面的思路。
具體算法如下:
struct node
{
int v;
node *next;
};
/*
返回鏈表的長度
鏈表爲空 返回0
*/
size_t listLen(node * p)
{
size_t num = 0;
while (p!=NULL)
{
num++;
p = p->next;
}
return num;
}
// 如果找到了 則返回指針 指向公共節點
// 如果不存在 則返回空指針
node * findFirstCommenNode(node * pheada, node * pheadb)
{
size_t lenA = listLen(pheada);
size_t lenB = listLen(pheadb);
node * plistA = pheada;
node * plistB = pheadb;
//調整長度,讓plistA 指向較長的一個鏈表
if (lenA < lenB)
{
plistB = pheada;
plistA = pheadb;
size_t t = lenA;
lenA = lenB;
lenB = t;
}
while(lenA > lenB)
{
plistA = plistA->next;
--lenA;
}
//一樣長了
//尋找公共節點
while (plistA!=NULL && plistA != plistB)
{
plistA = plistA->next;
plistB = plistB->next;
}
return plistA;
}
算法的空間複雜度O(1),時間複雜度O(m+n)