1. 题目
2. 代码
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *L1=headA,*L2=headB;
while(L1!=L2)
{
L1=(L1==NULL)?headB:L1->next;
L2=(L2==NULL)?headA:L2->next;
}
return L1;
}
};
设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。利用这个 a + c + b = b + c + a来使得从A开始访问的指针L1和从A开始访问的指针L1能够在链表相交出相交。
当访问 A 链表的指针访问到链表尾部时,令它从链表 B 的头部开始访问链表 B;同样地,当访问 B 链表的指针访问到链表尾部时,令它从链表 A 的头部开始访问链表 A。这样就能控制访问 A 和 B 两个链表的指针能同时访问到交点。
3. 结果
4. 吐槽
别人都是怎么写的啊,为什么我才击败这么少的人。
真不知道如何优化这算法。