题目
解法一 浪漫双指针(错的人迟早会走散,而对的人迟早会相逢)
/**
* 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==NULL||headB==NULL)return NULL;
ListNode *headA1=headA;
ListNode *headB1=headB;
while(headA1!=headB1)//开始循环
{
if(headA1)headA1=headA1->next;
else headA1=headB;//连接到B,若有循环则存在交点
//且headA1和headB1同时指向交点
if(headB1)headB1=headB1->next;
else headB1=headA;
}
return headA1;
}
};
解法二 暴力遍历
/**
* 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) {
ListNode *headA1=headA;
ListNode *headB1=headB;
while(headB1)
{
while(headA1)
{
if(headA1==headB1)return headA1;
headA1=headA1->next;
}
headB1=headB1->next;
headA1=headA;
}
return NULL;
}
};
解法三 哈希表
/**
* 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 *p1=headA;
while(p1)
{
set.insert(p1);
p1=p1->next;
}
p1=headB;
while(p1)
{
if(set.find(p1)!=set.end())return p1;
p1=p1->next;
}
return NULL;
}
};