判断两个单链表是否相交,若相交并找出相交的第一个点

news/2025/2/23 10:17:32

链表的正确相交情况如下:

 判断两个链表是否相交

//确定两个单链表是否相交 (用两个指针跑到两个单链表的尾结点,然后判断是否是同一个尾结点)
bool Intersect(PNode plist1, PNode plist2)
{
	//assert
	PNode p1 = plist1;
	PNode p2 = plist2;

	for(p1; p1->next!=NULL; p1=p1->next);   //此时for循环结束  p1在plist1这个单链表的尾结点上
	for(p2; p2->next!=NULL; p2=p2->next);   //此时for循环结束  p2在plist2这个单链表的尾结点上

	return p1 == p2;
}

 

判断两个链表是否相交并求出相交点 

//确定两个单链表是否相交,并且相交的话,返回第一个相交点
struct Node *Intersect_get_Node(PNode plist1, PNode plist2)
{
	//assert
	int len1 = Get_length(plist1);
	int len2 = Get_length(plist2);

	//接下来 我们需要保证  让p永远指向较长的单链表
	PNode p = len1>=len2 ? plist1 : plist2;
	PNode q = len1>=len2 ? plist2 : plist1;

	for(int i=0; i<abs(len1-len2); i++)//abs 计算绝对值  
	{
		p = p->next;
	}

	//此时,p已经将差值跑完  这个时候 只需要循环判断p和q是否是用一个节点即可

	while(p != q)//这里要么p和q指向有效地址 退出循环    要么p==q==NULL 退出循环
	{
		p = p->next;
		q = q->next;
	}


	return p; //return q;
}

测试: 

int main()
{
	Node head1;
	Init_list(&head1);
	for (int i = 0; i < 10; i++)
	{
		Insert_pos(&head1, i, i + 1);
	}

	Node head2;
	Init_list(&head2);
	for (int i = 0; i < 20; i++)
	{
		Insert_pos(&head2, i, i + 101);
	}
	Show(&head1);
	Show(&head2);
	bool tag1 = Intersect(&head1, &head2);
	if (tag1)
	{
		printf("相交了\n");
	}
	else
	{
		printf("没有相交\n");
	}

	PNode p = &head2;
	for (int i = 0; i < 12; i++)
	{
		p = p->next;//p最后指向plist2的  112
	}
	PNode q = &head1;
	for (int i = 0; i < 5; i++)
	{
		q = q->next;//q最后指向plist1的  5
	}

	p->next = q->next;//手动发生相交
	Show(&head1);
	Show(&head2);
	//1 2 3 4 5 6 7 8 9 10
	//101 102 103 104 105 106 107 108 109 110 111 112 6 7 8 9 10

	tag1 = Intersect(&head1, &head2);
	if (tag1)
	{
		printf("相交了\n");
	}
	else
	{
		printf("没有相交\n");
	}


	struct Node* tmp = Intersect_get_Node(&head1, &head2);
	if (tmp != NULL)
	{
		printf("相交点的有效值为:%d\n", tmp->data);
	}

	bool tag2 = Del_Node((&head1)->next);
	if (tag2)
	{
		Show(&head1);
	}

	return 0;
}

 


http://www.niftyadmin.cn/n/511574.html

相关文章

huginn website agent对提取结果排序

当配置好huginn的website之后&#xff0c;想给提取的内容排个序&#xff0c;那就用下面这堆代码&#xff0c;因为官网里也这么说的&#xff0c; "events_order": [ [ "{{date_published}}", "string", "true" ] ] 但是如果配置完报下面…

2014怎么安装e计算插件_「编曲佬必看」克服音源安装恐惧症!这篇文章就够

本文编辑&#xff1a;Moon各位朋友好&#xff0c;在今天&#xff0c;我决定写下如何安装音源的教程。本教程以Hypersonic1.0这种VST插件为例为什么我要写呢&#xff1f;很简单&#xff0c;因为壹起编曲体验营&#xff0c;终于开课了但是我作为一个企业的经营者&#xff0c;我不…

[BZOJ1468]Tree

Description 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K Input N&#xff08;n<40000&#xff09; 接下来n-1行边描述管道&#xff0c;按照题目中写的输入 接下来是k Output 一行&#xff0c;有多少对点之间的距离小于等于k Sample Input 7 …

电线直径对照表_最新电线规格与直径对照表,国标电线平方数和直径一览表

电线的平方数对应的直径是测量该电线是否合格的检测之一&#xff0c;下面胜华电气小编就来介绍下电线规格与直径对照表。一、电线规格与直径对照表1、国标电线规格与直径对照表(BV硬线)2、电线规格与直径对照表(BVR软线)正规合格的产品铜芯的电线1平方毫米能承载6-8安培的电流&…

顺序表----队列

队列&#xff1a;和栈一样&#xff0c;也是受到限制的线性表&#xff0c;与栈不同的地方在于&#xff0c;它遵循着先进先出&#xff08;FIFO&#xff09;的规则 一端进行入队&#xff0c;一端进行出队&#xff0c;我们将入队的一端称作队尾(允许插入的一端&#xff09;&#x…

groovy对枚举的支持

/*** Created by Jxy on 2019/1/3 15:42* groovy对枚举的支持*/enum CoffeeSize{SHORT,SMALL,BIG,MUG } def orderCoffee(size){println "coffee is $size"switch (size){case [CoffeeSize.SHORT,CoffeeSize.SMALL]:println "your are health conscious"br…

springboot记录用户访问次数_使用 SpringBoot Admin 监控你的 SpringBoot 程序

来源于公众号未读代码 &#xff0c;作者达西呀1.Spring Boot Admin 是什么Spring Boot Admin 是由 codecentric 组织开发的开源项目&#xff0c;使用 Spring Boot Admin 可以管理和监控你的 Spring Boot 项目。它分为客户端和服务端两部分&#xff0c;客户端添加到你的 Spring …

判断单链表是否存在回文

回文即就是 “123454321”&#xff0c;“abcba"满足这样的数据链表&#xff0c;需要两个指针&#xff0c;一个指向头&#xff0c;一个指向尾,一个向后走&#xff0c;一个向前走&#xff0c;判断数据是否相等。但是单链表无法从后节点指向前节点&#xff0c;因此将单链表中…