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

2021-09-23 01:51:20 字數 941 閱讀 6247

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

解題思路:首先是暴力法。其次要去想想有沒有更好的解法。

利用棧的思想是,以此把兩個鍊錶的節點放入兩個棧中,然後以此從棧頂取出節點進行比較,如果相同,則彈出該節點,接著比較下乙個節點,直到找到最後乙個相同的節點。

也可以不用stack來實現。因為有公共節點的鍊錶後邊的節點都重合,因此分別計算出兩個鍊錶的長度,然後可以求出長鍊錶比短鍊錶長出的長度l,讓長鍊錶的指標先走l步,最後,兩個指標同時出發遍歷,以此比較,直到找到第乙個想等的節點。

解題**:

1.蠻力法 時間複雜度o(m*n)

2.利用stack的解法 時間複雜度o(m+n)

3.利用有公共節點的兩個鍊錶的結構特點出發 時間複雜度為o(m+n),不需要用到棧

/*

struct listnode

};*/

class solution

//先在長鍊表上走nlengthdif步,再同時遍歷兩個鍊錶

for(int i=0; inext;

while((plistheadlong!=nullptr)&&(plistheadshort!=nullptr)&&(plistheadlong!=plistheadshort))

listnode* pfirstcommonnode=plistheadlong; //此時plistheadlong==plistheadshort

return pfirstcommonnode;

}private:

unsigned int getlistlength(listnode* phead)

return i;

}};

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

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

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

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

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

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