题目地址
解题思路
有两种解题方法:双指针法和哈希表法。
双指针法比较巧妙,这已经是第三遍写了,就不多详述了。
哈希表法就是先保存其中一个链表的全部节点。然后遍历另一个链表,如果已经保存就直接返回。
代码实现(C++)
双指针法
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
//浪漫相遇法
if(headA==nullptr || headB==nullptr)
{
return nullptr;
}
ListNode* PA=headA;
ListNode* PB=headB;
while(PA!=PB)
{
PA = PA==nullptr ? headB : PA->next;
PB = PB==nullptr ? headA : PB->next;
}
return PB;
}
};
哈希表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
unordered_set<ListNode*> set;
ListNode* temp=headA;
while(temp!=nullptr)
{
set.insert(temp);
temp=temp->next;
}
temp=headB;
while(temp!=nullptr)
{
if(set.count(temp))
{
return temp;
}
else
{
temp=temp->next;
}
}
return nullptr;
}
};