一、题目
描述
输入两个无环的单链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
二、思路
1、有公共节点的概念
有公共节点是指两个链表从第一个公共节点开始,剩下的节点都是相同的
2、把两个链表转换为相同长度的链表。然后用双指针找到第一个节点
转换方法:a+b=b+a
三、代码一:双指针
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
if(pHead1==nullptr || pHead2==nullptr)
{
return nullptr;
}
ListNode *p1=pHead1;
ListNode *p2=pHead2;
while(p1 !=p2)
{
p1=p1?p1->next:pHead2;
p2=p2?p2->next:pHead1;
}
return p1;
}
};
四、代码二:哈希(添加到set容器,再判断)
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
set<ListNode *>dic;
ListNode *cur=headA;
while(cur){
dic.emplace(cur);
cur=cur->next;
}
while(headB){
if(dic.count(headB)){
return headB;
}
headB=headB->next;
}
return NULL;
}
};