链表-----判断两个链表(无环)是否交叉

#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;
}

猜你喜欢

转载自blog.csdn.net/weixin_39916039/article/details/81477815