先簡單分析:
兩個單鏈表相交分如圖幾種情況:
實現如下:
//判斷鍊錶是否帶環,若帶環求入口點
pnode iscirclelist(pnode *phead)
pnode pfast = (*phead)->next->next;
pnode pslow = (*phead)->next;
while (pfast != pslow && null != pfast && null != pfast->next)
if (null == pfast || null == pfast->next)
pslow = *phead;
while (pslow != pfast)
return pslow;
}//求鍊錶結點個數
size_t size(pnode phead)
//先判斷是不是帶環的,帶環就獲取入口點
pnode pcur = iscirclelist(&phead);
size_t count = 0;
//不帶環,遍歷一次,計算出結點個數
if (null == pcur)
}else
//計算環的長度
ptmp = ptmp->next;
count++;
while (ptmp != pcur)
}return count;
}//兩個不帶環單鏈表求交點
pnode isintersecttowlistnocircle(pnode *phead1, pnode *phead2)
if (null == phead2 && null == *phead2)
pnode pcur1 = *phead1;
pnode pcur2 = *phead2;
int idx = size(pcur1) - size(pcur2);
//idx作為計數器,讓長的鍊錶先移動idx個結點
if (idx > 0)
}else
}//然後他們一起向後移動,知道他們指向同乙個交點
while (pcur1 != pcur2)
return pcur1;
}//判斷兩個鍊錶是否相交,若相交求交點
pnode isintersecttowlist(pnode *phead1, pnode *phead2)
if (null == phead2 && null == *phead2)
pnode pcur1 = *phead1;
pnode pcur2 = *phead2;
pcur1 = iscirclelist(phead1);
pcur2 = iscirclelist(phead2);
//如果兩個鍊錶為不帶環單鏈表
if (null == pcur1 && null == pcur2)
//如果兩個鍊錶帶環
if (null != pcur1 && null != pcur2)
//如果是環內相交,也就是入口點不同(也可能兩個帶環鍊錶不相交)
else
//回到自己說明沒有相交
if (ptmp == pcur1)
//如果找到pcur2則返回乙個入口點,因為整個環都是他們的交點
else}}
return null;
}
求兩單鏈表交點
題目 已知兩單鏈表有交點,給出兩單鏈表的頭指標,求交點位置。思路 自交點至公共尾部的結點都是相同的,則分別遍歷兩個鍊錶,並將每個結點的指標分別儲存在兩個陣列中,然後從兩陣列尾部開始比較,到兩指標值開始不同時,前一位置即使指向交點的指標。思路 分別遍歷兩鍊錶,得到各自的長度l1 l2,然後長的減短的得...
如何獲取兩個單鏈表交點
之前的一篇部落格 如何判斷兩條單鏈表是否有交點 只說了如何判斷是否有交點,但並沒有提及如何得到交點。設定陣列分別儲存兩條鍊錶所有節點的位址,然後一 一比較?可行是可行,不過空間時間複雜度太高,不建議使用。那有沒有更高效的方法呢?方法1從相交鍊錶的特點來切入分析,看看下面這張圖。一般來說,相交鍊錶會自...
判斷兩個單鏈表是否有交點
問題描述 乙個比較經典的問題,判斷兩個鍊錶是否相交,如果相交找出他們的交點。思路 1 碰到這個問題,第一印象是採用hash來判斷,將兩個鍊錶的節點進行hash,然後判斷出節點,這種想法當然是可以的。2 當然採用暴力的方法也是可以的,遍歷兩個鍊錶,在遍歷的過程中進行比較,看節點是否相同。3 第三種思路...