判断两个非空单向链表是否相交,若相交返回第一个公共结点,若不相交返回NULL(c语言实现)

思路:判断两个链表有没有相交,及判断它们的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都会重新分配单元,博主自己测试,两条链表相交居多。

发布了22 篇原创文章 · 获赞 15 · 访问量 874
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览