两个链表的第一个公共结点-邪门歪道做法
两个链表的第一个公共结点
https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tags=&title=&diffculty=0&judgeStatus=0&rp=1&tab=answerKey
两个链表的第一个公共结点
题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
思路
1.做这题时,我有许多想法,但其中一种做法最为简单粗暴,堪称邪门做法,和其他人的做法都不一样,因此记录下来。
正道做法
比较直接的做法是,让两个链表的长度相等,然后使用双指针即可。至于如何让两个链表的长度相等,就是将b链表拼接到a链表后,同时让a链表拼接到b链表后。
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
ListNode *ta = pHead1, *tb = pHead2;
while (ta != tb) {
ta = ta ? ta->next : pHead2;
tb = tb ? tb->next : pHead1;
}
return ta;
}
};邪道做法
我的邪门做法非常简单粗暴,就是用哈希表作为标志数组,属于脑子都不动动的做法。当然如果用集合效果也差不多。
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
map<ListNode*,bool> m;
while(pHead1){
m[pHead1]=true;
pHead1=pHead1->next;
}
while(pHead2){
if(m.find(pHead2)!=m.end())
return pHead2;
m[pHead2]=true;
pHead2=pHead2->next;
}
return nullptr;
}
};


