输入两个链表,找出它们的第一个公共节点。
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
思路:双指针
使用两个指针node1,node2分别指向两个链表headA,headB的头节点,然后同时分别逐结点遍历,当node1到达链表headA的末尾时,重新定位到链表headB的头节点;当node2到达链表headB的末尾时,重新定位到链表headA的头节点。
这样,当它们相遇时,所指向的结点就是第一个公共结点。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *node1 = headA;
ListNode *node2 = headB;
while (node1 != node2)
{
node1 = node1 != nullptr ? node1 -> next : headB;
node2 = node2 != nullptr ? node2 -> next : headA;
}
return node1;
}
};