#include<stdio.h>
typedef struct ListNode
{
int data;
struct ListNode *next;
}linklist;
linklist *head = NULL;
void IsIntersect(ListNode*list1, ListNode*list2)
{
int size1, size2;
size1 = size2 = 0;
ListNode *temp1 = list1;
ListNode *temp2 = list2;
//遍历list1,list2,并保存链表长度
while (temp1)
{
temp1 = temp1->next;
++size1;
}
while (temp2)
{
temp2 = temp2->next;
++size2;
}
//当list1和list2最后两个节点相同时
if (temp1 == temp2)
{
//比较长的那个链表前进size1-size2个节点
if (size1 > size2)
while (size1 - size2 > 0)
{
list1 = list1->next;
--size1;
}
if (size2 > size1)
while (size2 - size1 > 0)
{
list2 = list2->next;
--size2;
}
//两链表继续遍历直到相交节点为止
while (list1 != list2)
{
list1 = list1->next;
list2 = list2->next;
}
//保存相交节点的数据并打印
int data = list1->data;
printf("链表是交叉的,相交于:%d\n",data);
}
//当两个链表最后一个节点不相同时则不是相交链表
else
printf("链表不是交叉的");
}
//主函数
int main()
{
//创建两个交叉链表
ListNode a,b,c,d,e,f,g,h;
a.data = 1;
b.data = 2;
c.data = 3;
d.data = 4;
e.data = 5;
f.data = 6;
g.data = 7;
h.data = 6;
a.next = &b;
b.next = &c;
d.next = &e;
e.next = &f;
f.next = &c;
c.next = &g;
g.next = &h;
h.next = NULL;
IsIntersect(&a, &d);
return 0;
}