求兩個單鏈表的交點(可能帶環)

2021-07-28 15:10:57 字數 1771 閱讀 7011

先簡單分析:

兩個單鏈表相交分如圖幾種情況:

實現如下:

//判斷鍊錶是否帶環,若帶環求入口點

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 第三種思路...