劍指offer面試題目 兩個鍊錶的第乙個公共節點

2021-08-04 14:16:08 字數 1663 閱讀 7601

輸入兩個鍊錶,找出它們的第乙個公共結點。

這個問題一種常想到的方法就是兩層迴圈遍歷,外層迴圈遍歷鍊錶a,對a中每個節點,遍歷鍊錶b,如果在b中找到,說明這個節點是第乙個公共節點,但是這樣的方法時間複雜為mn,一般是不允採用的。

所以我們需要分析更深層次的問題,找到其中的規律,我們如果動手畫一下一般的鍊錶圖就能夠發現兩個鍊錶的第乙個公共節點之後的樣子一定是如下表示(由此可以發現有時候動手是很重要的)

可以發現兩個鍊錶在第乙個節點重合之後不會再分開了

簡單多說一句不會分開的原因,因為單向鍊錶的節點只有乙個nextnode指向下乙個節點,那麼如果該節點重合了,那麼後面的節點一定是同乙個

如果直觀點對這個圖形進行解釋就是兩個鍊錶重合之後呈現乙個y型而不是乙個x型。

方法一

我們可以使用棧的特點來解決這個問題:分別把兩個鍊錶的結點放入兩個棧裡,這樣兩個鍊錶的尾結點就位於兩個棧的棧頂,接下來比較兩個棧頂的結點是否相同。如果相同,則把棧頂彈出接著比較下乙個棧頂,直到找到最後乙個相同的結點。

方法二:

我們可以首先遍歷兩個鍊錶得到它們的長度,就能知道哪個鍊錶比較長,以及長的鍊錶比短的鍊錶多幾個結點。在第二次遍歷的時候,在較長的鍊錶上先走若干步,接著再同時在兩個鍊錶上遍歷,找到的第乙個相同的結點就是它們的第乙個公共結點。

方法一:

public

static node findfirstcommonnode(node head1, node head2)

stackstack1 = new stack();

stackstack2 = new stack();

while(head1 != null)

while(head2 != null)

node node1 = null;

node node2 = null;

node common = null;

while(stack1.count > 0 && stack2.count > 0)

else

}return

common;

}

方法二:

public

static node findfirstcommonnode(node head1, node head2)

// 先在長鍊表上走幾步

for (int i = 0; i < diff; i++)

// 再同時在兩個鍊錶上遍歷

while (headlong != null && headshort != null && headlong != headshort)

node commonnode = headlong;

return commonnode;

}private

static

intgetlistlength(node head)

return length;

}

劍指Offer 面試題17 合併兩個有序鍊錶

輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。分析 這道題有點類似於面試題4 替換空格中的擴充套件題目 兩個有序陣列合併。大體思路上是一致的,很類似,分別遍歷兩個鍊錶,將小的結點鏈結到新煉表表尾。後期處理有點區別就是,合併陣列在迴圈結束後,需要用whil...

劍指offer 面試題17 合併兩個排序的鍊錶

題目 輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的結點仍然是按照遞增排序的。思路 每次從兩個鍊錶中選取較小的結點作為新鍊錶的結點,那麼這裡有兩種方法,迴圈或者遞迴。1 迴圈,每次取出兩個鍊錶中較小的結點插入新鍊錶,到達其中乙個鍊錶的尾結點時,另外乙個鍊錶的其餘部分直接接在這個尾結點上。2 從...

劍指offer 面試題17 合併兩個排序的鍊錶

題目描述 輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的結點仍然是按照遞增排序的。例如鍊錶1,3,5,7和鍊錶2,4,6,8.合併後鍊錶為1,2,3,4,5,6,7,8 題目解析 先是判斷給出的兩個鍊錶是否是空表。然後再比較兩個表的頭結點,小的結點作為頭結點,然後兩個鍊錶依次遍歷,同時比較大小...