問題描述:
輸入兩個鏈表,找出它們的第一個公共結點。
本題的思路很簡單,首先我們考慮一種特殊的相交鏈表,如下圖所示:
兩個相交的鏈表長度相同,想要找到第一個公共的節點很簡單,維護兩個指針,從2個鏈表頭開始,逐個節點遍歷對比,相同時就找到了第一個公共交點。
擴展爲複雜的情況,兩個鏈表長度不同時:
這種情況就可以先得到兩個鏈表的長度,然後同樣維護兩個指針指向頭節點,此時先需要根據兩個鏈表的長度,將長的指針向後移動長度之差的節點,此時就變爲了上面簡單的情況。
解題代碼:
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {
if(pHead1==nullptr || pHead2==nullptr)
return nullptr;
//求鏈表長度
int length1 = getLength(pHead1);
int length2 = getLength(pHead2);
//將長的鏈表頭節點移動到和短的一樣長
if(length1>length2){
for(int i=0;i<length1-length2;i++){
pHead1 = pHead1->next;
}
}
if(length1<length2){
for(int i=0;i<length2-length1;i++){
pHead2 = pHead2->next;
}
}
//一起向後遍歷鏈表,相同時返回結果
while(pHead1 && pHead2){
if(pHead1==pHead2)
return pHead1;
pHead1 = pHead1->next;
pHead2 = pHead2->next;
}
return nullptr;
}
int getLength(ListNode *pHead){
int res=0;
while(pHead!=nullptr){
res++;
pHead = pHead->next;
}
return res;
}
};