輸入兩個鍊錶,找出它們的第乙個公共結點。(注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式顯示的,保證傳入資料是正確的)解題思路
上**(c++很香)
法一:暴力列舉
listnode* findfirstcommonnodebl( listnode* phead1, listnode* phead2)
pnode1 = pnode1->next;
}return nullptr;
}
法二:輔助棧
注意,在判斷棧頂元素的時候,直到棧頂元素不相等時,可能是找到了第乙個相等的節點,也可能是沒有相等的節點。
listnode *findfirstcommonnode(listnode *heada, listnode *headb)
while(q != nullptr)
int sizea = stack_a.size();
int tmp = 0;
while(!stack_a.empty() && !stack_b.empty())
}tmp = sizea - tmp;
p = heada;
while(tmp--)
p = p->next;
return p;
}
法三:雙指標(很妙)
這裡先假設鍊錶a
頭結點與結點8
的長度 與 鍊錶b
頭結點與結點8
的長度相等,那麼就可以用雙指標。
初始化:指標ta
指向鍊錶a
頭結點,指標tb
指向鍊錶b
頭結點
如果ta == tb
, 說明找到了第乙個公共的頭結點,直接返回即可。
否則,ta != tb
,則++ta,++tb
所以現在的問題就變成,如何讓本來長度不相等的變為相等的?
假設鍊錶a
長度為a
, 鍊錶b
的長度為b
,此時a != b
但是,a+b == b+a
因此,可以讓a+b作為鍊錶a的新長度,b+a作為鍊錶b的新長度。
// 雙指標法
listnode* findfirstcommonnodedouble(listnode* phead1, listnode* phead2)
}// 走到最後是pnode1 == pnode2 == nullptr
// 所以如果有相同的節點,則返回第乙個,如果沒有,就最後返回nullptr
return pnode1;
}
面試題52 兩個鍊錶的第乙個公共節點
題目描述 輸入兩個鍊錶,找出它們的第乙個公共結點。有公共節點的兩個鍊錶在公共節點匯合後,後面的節點均相同,為y型。方法一 消除長度差後,兩者到公共節點距離相同。時間複雜度o m n struct listnode class solution return len listnode findfirs...
面試題52 兩個鍊錶的第乙個公共節點
面試題52 兩個鍊錶的第乙個公共節點 題目 輸入兩個鍊錶,找出它們的第乙個公共結點 思路 首先遍歷兩個鍊錶得到它們的長度,比較長短。第二遍,在較長的鍊錶上先走若干步,接著同時在兩個鍊錶上遍歷 找到的第乙個相同的節點就是它們的第乙個公共節點 classlistnode6 publicclassno52...
面試題52 兩個鍊錶的第乙個公共節點
輸入兩個鍊錶,找出它們的第乙個公共結點。注意因為傳入資料是鍊錶,所以錯誤測試資料的提示是用其他方式 顯示的,保證傳入資料是正確的 考察點 時間空間複雜度分析 鍊錶程式設計。思路 一開始想到的是遍歷其中一條鍊錶,找到乙個節點,就去另一條鍊錶中去找相同的,這樣的複雜度比較高。所以借用前文的思路,既然是找...