力扣hot100从头刷----100.1环形链表
🎬 胖咕噜的稞达鸭:个人主页
相交链表
相交链表

题目解析:
有两个单链表,现在我们已知,两个单链表的头节点是headA,headB,要求我们返回两个单链表的相加部分的第一个节点,不相等就返回nullptr。
思路:
我们先定义两个指针,ListNode* p=headA;ListNode* q=headB。将p走到相加节点的距离定义为x,q走到相加节点的距离定义为y,将相交之后一直到两节点走到空的距离设为z;已知(x+z)+y==(y+z)+x;
如果p的下一个节点不为空,那就继续走,如果已经走到空位置,那就让p走到第二个链表的头节点开始走;
与此同时q的下一个节点不为空的话,那就继续走,如果走到了空位置,那就让q走到第一个链表的头节点开始走;
因为p和q都必须走完x+y+z的长度,他们一定会在第一个相加链表的节点相交。
循环结束时,如果两条链表相交,那么此时 p 和 q 都在相交的起始节点处,返回 p;如果两条链表不相交,那么 p 和 q 都走到空节点,所以也可以返回 p,即空节点。

现在我们将思路转化为代码:
/*** 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*p=headA;ListNode* q=headB;while(p!=q){p=p?p->next:headB;q=q?q->next:headA;}return p;}
};
