思路:判断两个链表有没有相交,及判断它们的next是否相等,与数据域的值无关,及判断if(p1->next = p2->next)。p1,p2为两个指针,初始,我们将p1,p2都放在h1,h2上,判断h1所指的链表的每个结点是否与该p2相交,中途若相交则返回结点,否则p1一直跑,跑到null,一圈结束,将p1拉回h1,p2往前调一个,重复上述动作,经过分析我们需要两个循环,一个遍历p2,一个遍历p1,遍历p1的结束条件为p1不为NULL,遍历p2的结束条件为p2->next不为NULL,因为两条链表的最后一个结点都指向NULL,所以不用判断p1,p2的最后一个结点是否相交,没有意义。
运行环境:VS2017
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int date;
struct node*next;
}ElemSN;
//创建链表
ElemSN*GreatLink(int Date[], int n)
{
int i;
ElemSN*p, *t = 0, *h = 0;
for (i = 0;i < n;i++)
{
p = (ElemSN*)malloc(sizeof(ElemSN));
p->date = Date[i];
p->next = NULL;
if (!h)
h = t = p;
else
t = t->next = p;
}
return h;
}
//输出链表
PrintLink(ElemSN*h)
{
ElemSN*p;
for (p = h;p;p = p->next)
printf("%3d", p->date);
printf("\n");
}
ElemSN*InterSect(ElemSN*h1, ElemSN*h2)
{
ElemSN*p1=h1, *p2=h2;
while (p2->next)//遍历p2
{
while (p1)//遍历p1
{
if (p1->next = p2->next)
return p1;
else
p1 = p1->next;
}
p1 = h1;
p2 = p2->next;
}
return NULL;
}
int main(void)
{
int a[6] = {1,2,3,4,5,6};
int b[6] = { 7,8,9,10,11,12 };
ElemSN*head1, *head2, *k;
head1 = GreatLink(a, 6);
head2 = GreatLink(b, 6);
PrintLink(head1);
PrintLink(head2);
k = InterSect(head1, head2);
printf("%x", k->next);
system("pause");
}
每次的运行结果都不一样,因为每次创建链表的时候malloc都会重新分配单元,博主自己测试,两条链表相交居多。