class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
set<ListNode*> node_set; // 将链表A的节点插入set中
ListNode *curA = headA;
while(curA){
node_set.insert(curA);
curA=curA->next;
}
ListNode *curB = headB;
while(curB){
if(node_set.count(curB)){
return curB; //找到相交节点
}
curB=curB->next;
}
return NULL;
}
};
方法二:双指针法
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if (!headA || !headB) {
return nullptr; // 如果任一链表为空,则不存在相交节点
}
ListNode *ptrA = headA;
ListNode *ptrB = headB;
while (ptrA != ptrB) {
// 如果一个指针到达链表尾部,将其移到另一个链表的头部
ptrA = ptrA ? ptrA->next : headB;
ptrB = ptrB ? ptrB->next : headA;
}
// 当两个指针相遇时,就是相交节点,或者它们都为空,表示没有相交节点
return ptrA;
}
};
-
在循环内部,进行以下操作:
- 检查
ptrA
和ptrB
是否为空,如果为空,则将它们分别移到另一个链表的头部。这是为了处理两个链表长度不同的情况,以便两个指针能够同时到达链表末尾。 - 否则,将
ptrA
和ptrB
分别移动到它们的下一个节点,即ptrA = ptrA->next
和ptrB = ptrB->next
。
- 检查
-
当循环结束时,有两种可能性:
- 如果两个指针相遇,那么它们相遇的节点就是相交节点,返回
ptrA
或ptrB
都可以。 - 如果两个指针同时到达链表末尾,表示没有相交节点,返回
nullptr
。
- 如果两个指针相遇,那么它们相遇的节点就是相交节点,返回
这种双指针法的关键在于,通过在到达链表末尾时将指针移到另一个链表的头部,可以使两个指针最终相遇在相交节点处,或者同时到达链表末尾。这种方法具有时间复杂度O(m + n),其中m和n分别是链表A和链表B的长度。