链接:
剑指 Offer 52. 两个链表的第一个公共节点
题意:
如题
解:
非常有趣的双指针
首先我们不管他们是否有公共段啊,我们要知道一个指针从A出发走到A结尾,再从B出发走到B结尾,和从B出发最终到A结尾是一样的距离,那么我们先将最后面的N个排除(N取两个链表最短长度-1)
那么当Red指针到RedEnd位置,Blue指针到BlueEnd的时候,两个指针走过的距离是一样的,(也就是接下来两个指针同步指向倒数第K个节点,由于公共段最多包含最后N+1个节点,BlueEnd和RedEnd就是倒数第N+1个节点,在此完成同步)接下来判断两个指针是否指向同一个节点即可
我这边使用变量zt
标记两个指针是否移动到了另一个链表,如果都移动到了另一个链表还走到了结尾那就没有公共段
实际代码:
#include<iostream>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
ListNode *A=headA,*B=headB;
if(headA==nullptr||headB==nullptr) return nullptr;
int zt=0;
while(headA!=headB||zt==0)
{
headA=headA->next;
headB=headB->next;
if(headA==headB&&zt!=0) break;
if(headA==nullptr)
{
headA=B;zt++;
}
if(headB==nullptr)
{
headB=A;zt++;
}
}
return headA;
}
int main()
{
}
限制:
如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。