解法一:用一个集合去判断
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(!headA || !headB){
return nullptr;
}
set<ListNode *> s;
ListNode *tmp1 = headA;
ListNode *tmp2 = headB;
while(tmp1){
s.insert(tmp1);
tmp1 = tmp1->next;
}
while(tmp2){
if(s.find(tmp2) != s.end()){
return tmp2;
}
tmp2 = tmp2->next;
}
return nullptr;
}
};
解法二:
先遍历一遍两个链表得到的长度差N,然后让长链表先走N步,之后一起走,如果有交点必相遇。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(!headA || !headB){
return nullptr;
}
int len1 = 0;
int len2 = 0;
ListNode *tmp1 = headA;
ListNode *tmp2 = headB;
while(tmp1){
len1++;
tmp1 = tmp1->next;
}
while(tmp2){
len2++;
tmp2 = tmp2->next;
}
if(len1 > len2){
int len = len1 - len2;
while(len--){
headA = headA->next;
}
}
if(len1 < len2){
int len = len2 - len1;
while(len--){
headB = headB->next;
}
}
while(headA && headB){
if(headA == headB){
return headA;
}
headA = headA->next;
headB = headB->next;
}
return nullptr;
}
};
解法三:当一个链表到达尾部后,跳到另外一个链表的头部。这样如果相交则一定会相遇。
如果发生了第三次链表触尾,为说明没有交点
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(!headA || !headB){
return nullptr;
}
int cnt = 0;
ListNode *tmp1 = headA;
ListNOde *tmp2 = headB;
while(cnt < 3)
{
if(tmp1 == tmp2){
return tmp1;
}
if(!tmp1->next){
tmp1 = headB;
cnt++;
}
else{
tmp1 = tmp1->next;
}
if(!tmp2->next){
tmp2 = headA;
cnt++;
}
else{
tmp2 = tmp2->next;
}
}
return nullptr;
}
};