链表如果有交点,就代表链表L1某个p1节点和链表L2某个p2节点相同。所以不管如何,最后交汇一起呈Y型或者V型。
1.那么判断是否有交点也很简单,可以定义一个数组存放各一个链表每个节点的地址,再遍历另一条链表,看是否存在节点地址和数组中的元素相同。如果相同就有交点,代码如下;
Node* fx(Node *p1,Node *p2)
{
Node * arr[20];
int i=0;
for(;p1!=NULL;p1=p1->next)
{
arr[i]=p1;
i++;
}
for(;p2!=NULL;p2=p2->next)
{
for(int j=0;j<=i;j++)
{
if(p2==arr[j])
{return p2;}
}
}
return NULL;
}
为了偷懒随意定义了一个长度为20的数组,如果要实用化可以改为可扩容数组;
2.还有一种方法就是不论是v型还是Y型相交,都可以看得出,如果相交的话,两个链表的最后一个节点应该是一样的。因此可以2条链表同时遍历,然后存储下最后一个节点的地址,比较两个地址是否相等就能判断是否相交了。
3.最后一种方法,让第一条链表先遍历到最后,第一条链表最后的节点的next应该为null吧,把它指向第二条链表的头结点,这样就把问题转化为第二条链表是否有环了,如果有环,则代表有交点,无环则无交点。