学数据结构的时候见过这种算法,所以直接写出来了;
核心思想就是先求两个链表的长度差,然后指针后移 “长度差” 个单位,这样两个链表就可以同步操作了;
时间复杂度 O(n),空间复杂度O(1);
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if (!headA || !headB) return NULL;
int a = 0, b = 0;
ListNode *p=headA, *q=headB;
while (1)
{
if (p)
{
a++; p = p->next;
}
if (q)
{
b++; q = q->next;
}
if (!p && !q)
break;
}
p = headA; q = headB;
if (a > b)
{
for (int i = a - b; i > 0; i--)
p = p->next;
}
if (a <= b)
{
for (int i = b - a; i > 0; i--)
q = q->next;
}
while (1)
{
if (!q || !q) return NULL;
if (p == q) return p;
else
p = p->next,q = q->next;
}
}
};