题解
1. 用两个指针 p1,p2 分别指向两个链表 headA,headB 的头结点,同时向后遍历。
2. 当指针到达链表末尾时,重新定位到另一个链表的头结点。
3. 当它们相遇时,所指向的结点就是第一个公共结点。
解释
设A链表的非公共部分长度为LA,B链表的非公共部分长度为LB,公共部分长度为C。
A链表总长度为LA + C,B链表总长度为LB + C。
当指针按照题解方式走下去,p1第二次走到公共节点的时候,走过的长度为LA + C + LB,p2第二次走到公共节点的时候,走过的长度为LB + C + LA。p1 p2走过的长度相等,p1 p2 相遇。
所以,当p1 p2 相遇(相等)的时候,指向的节点就是公共节点。
//cpp
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *p1 = headA;
ListNode *p2 = headB;
while (p1 != p2) {
if(p1 != NULL)//p1没有走到结尾
p1 = p1->next;//p1指向下一个节点
else//p1走到结尾
p1 = headB;//p1指向另一个链表头
if(p2 != NULL)//p2没有走到结尾
p2 = p2->next;//p2指向下一个节点
else //p2走到结尾
p2 = headA;//p2指向另一个链表头
}
return p1;
}
};
如果觉得不错,欢迎点赞、收藏、评论
测试数据里面最下面的一个整数是啥意思啊,看y总视频说的是把第二个链表插入第一个链表的哪个位置,但是还是不懂
如果没有公共结点,程序会无限循环
不会的,如果两个链表不相交,公共结点就是空结点
明白了 a+b=b+a
就都是 nullptr,p1 == p2 == nullptr , 就退出 while 循环了哦
感谢
tql佬
妙啊
太狠了
女少口阿
强哈
妙啊
牛逼
为什么if里面是p->next就会报错呀
输入空链表时p为空,对空指针取next报错
有心了大佬
妙啊!
思路 六六六
tql
有心了这么详细
谢谢大佬,因为你的图解和解释终于明白了
赞,终于明白啥意思了
tql
赞,终于明白啥意思了
6