主要思路
方法一:用栈
将链表a和链表b都存入栈中
如果刚开始栈顶元素就不同说明没有相交
然后依次出栈,直到栈顶元素不相同时,即最后弹出栈顶的元素即为相交的起始节点
方法二 哈希表 set
将链表a插入到集合中,然后顺序遍历链表b,如果集合中已经存在该元素说明就是相交的起始节点
反之,没有相交
方法三 双指针法
定义一个指针指向链表a,另一个指针链表b
两个指针一起走,当指向链表a的指针到达尾部时,将它指向链表b的头结点;
同理,当指向链表b的指针到达尾部时,将它指向链表a的头结点
如果某一时刻两个指针相等说明就是相交的结点(也包括最后的nullptr,就是不相交),这个可以手动模拟一下
struct ListNode {
int val;
ListNode *next;
ListNode():val(0),next(nullptr){}
ListNode(int x):val(x),next(nullptr){}
ListNode(int x,ListNode *next):val(x),next(nullptr){}
};
//方法一 用栈
/*
将链表a和链表b都存入栈中
如果刚开始栈顶元素就不同说明没有相交
然后依次出栈,直到栈顶元素不相同时,即最后弹出栈顶的元素即为相交的起始节点
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(!headA || !headB)return nullptr;
ListNode *curA = headA;
ListNode *curB =headB;
stack<ListNode *> staA,staB;
while(curA) {
staA.push(curA);
curA = curA->next;
}
while(curB) {
staB.push(curB);
curB = curB->next;
}
if(staA.top() !=staB.top())return nullptr;
ListNode *tmp = nullptr;
while(!staA.empty()&&!staB.empty()&&staA.top()==staB.top()) {
tmp = staA.top();
staA.pop();staB.pop();
}
return tmp;
}
};
//方法二:哈希表 set
/*
将链表a插入到集合中,然后顺序遍历链表b,如果集合中已经存在该元素说明就是相交的起始节点
反之,没有相交
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA==nullptr||headB==nullptr)return nullptr;
ListNode *curA = headA;
ListNode *curB = headB;
set<ListNode *> setList;
while(curA!=nullptr) {
setList.insert(curA);
curA = curA->next;
}
while(curB) {
if(setList.count(curB)) return curB;
curB = curB->next;
}
return nullptr;
}
};
//双指针法
/*
定义一个指针指向链表a,另一个指针链表b
两个指针一起走,当指向链表a的指针到达尾部时,将它指向链表b的头结点
同理,当指向链表b的指针到达尾部时,将它指向链表a的头结点
如果某一时刻两个指针相等说明就是相交的结点(也包括最后的nullptr,就是不相交)
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA==nullptr||headB==nullptr)return nullptr;
ListNode *curA = headA;
ListNode *curB = headB;
while(curA!=curB) {
if(curA==nullptr) {//curA到达尾部后指向链表b头结点
curA = headB;
}
else {
curA = curA->next;
}
if(curB==nullptr) {
curB = headA;
}
else {
curB = curB->next;
}
}
return curA;
}
};