這個問題一種常想到的方法就是兩層迴圈遍歷,外層迴圈遍歷鍊錶a,對a中每個節點,遍歷鍊錶b,如果在b中找到,說明這個節點是第乙個公共節點,但是這樣的方法時間複雜為mn,一般是不允採用的
分析問題
所以我們需要分析更深層次的問題,找到其中的規律,我們如果動手畫一下一般的鍊錶圖就能夠發現兩個鍊錶的第乙個公共節點之後的樣子一定是如下表示(由此可以發現有時候動手是很重要的)
可以發現兩個鍊錶在第乙個節點重合之後不會再分開了
簡單多說一句不會分開的原因,因為單向鍊錶的節點只有乙個next指向下乙個節點,那麼如果該節點重合了,那麼後面的節點一定是同乙個
如果直觀點對這個圖形進行解釋就是兩個鍊錶重合之後呈現乙個y型而不是乙個x型
解決問題
一般這種問題要用兩個類似指標的東西,乙個先走,乙個後走
所以我們先遍歷找到兩個鍊錶的長度m和n,如果m大,m比n大多少,比如說k,那麼先讓m先走k步,然後n和m再一起走
package 兩個鍊錶的第乙個公共節點;
public class problem52
public static listnode findfirstcommondnode(listnode head1,listnode head2)
int l1=getlength(head1);
int l2=getlength(head2);
if(l1>l2)
}else
}boolean f=true;
listnode plistnode=null;
while(f)
if(head1.val==head2.val)else
}return plistnode;
}public static int getlength(listnode node)
return len;}}
兩個鍊錶第乙個公共節點
先讓長的鍊錶的指標先走長的之差的步數,兩個再一起走,如果相遇就是第乙個公共節點 如果沒交點,就都走到空 struct listnode class solution while pl2 null 復位指標到頭節點 pl1 phead1 pl2 phead2 int dif len 0 if len1...
兩個鍊錶的第乙個公共節點
輸入兩個鍊錶,找出它們的第乙個公共的節點。碰到這種題的時候千萬不要用挨個遍歷的方法,時間複雜度高 對於兩個有相同節點的鍊錶的形狀一定是y。而不是x。然後還可能乙個鍊錶長乙個鍊錶短,我們可以求出差值,然後讓長鍊表先走差值的長度,然後在挨個比較就可以了。這樣時間複雜度就小很多了 劍指offer 名企面試...
兩個鍊錶的第乙個公共節點
題目 輸入兩個鍊錶,找出它們的第乙個公共結點。思路 先遍歷兩個鍊錶得到它們的長度,求出長鍊錶比短鍊錶多幾個 第二次遍歷,在長鍊表上先走若干步,接著同時在兩個鍊錶上遍歷,找到的第乙個相同的結點就是它們的第乙個公共結點。public class listnode public listnode find...