链接:
剑指 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) 内存。