判断两个单链表是否相交及相交的第一个节点

Posted When I See You Again

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断两个单链表是否相交及相交的第一个节点相关的知识,希望对你有一定的参考价值。

/*
	问题: 
	1.判断两个单链表是否相交
	2.找出第一个相交节点
	解题思路:
	1.若连个链表相交则从相交节点开始以后节点都是一样的 
	2.通过链表长度判断然后去寻找 
*/

#include<stdlib.h>
#include<stdio.h>

/*
	创建节点 
*/
typedef struct STU
{
	char a;
	struct STU *next; 
}*SListNode;

SListNode ListA;
SListNode ListB;

/*
	创建链表A 
*/ 
SListNode createAlist(char a)
{
	SListNode headA=(SListNode)malloc(sizeof(struct STU));
	headA->a=a;
	headA->next=NULL;
	return headA;		
}

/*
	创建链表B 
*/ 
SListNode createBlist(char b)
{
	SListNode headB=(SListNode)malloc(sizeof(struct STU));
	headB->a=b;
	headB->next=NULL;
	return headB;
}

/*
	插入元素 
*/
SListNode insertElement(SListNode h,char a)
{
	SListNode p=h;
	SListNode n=(SListNode)malloc(sizeof(struct STU));
	if(n==NULL)
	{
		printf("ERROR:内存申请失败\n");
		return NULL;
	} 
	n->a=a;
	n->next=NULL;
	while(p->next!=NULL)
	{
		p=p->next;
	}		
	p->next=n;
	return n;
}

/*
	打印链表 
*/ 
void printfList(SListNode h)
{
	int i=0;
	SListNode p=h;
	while(p!=NULL)
	{
		i++;
		printf("No.%d Element:%c\n",i,p->a);
		p=p->next; 
	}
}

/*
	判断两链表是否相交
	并给出第一个相交节点元素 
*/
void IsIntersectant(SListNode A,SListNode B)
{
	char res;
	int  n=0;
	SListNode pa=A;
	SListNode pb=B;
	int Alength=0;
	int Blength=0;
	while(pa->next!=NULL)
	{
		Alength++;
		pa=pa->next;
	}	
	while(pb->next!=NULL)
	{
		Blength++;
		pb=pb->next;
	}
	if((pa->a==pb->a)&&(pa==pb))
	{
		printf("A链表和B链表相交\n");
		pa=ListA;
		pb=ListB; 
		if(Alength==Blength)
		{
			while(Alength--)
			{
				if(pa==pb)
				{
					res=pa->a;
					break;
				}
				pa=pa->next;
				pb=pb->next;
			}
		}
		else if(Alength>Blength)
		{
			n=Alength-Blength;
			while((n)--)
			{
				pa=pa->next;		
			}	
			while(Blength--)
			{
				if(pa==pb)
				{
					res=pa->a;
					break;
				}
				pa=pa->next;
				pb=pb->next;
			}
		}
		else
		{
			n=Blength-Alength;
			while((n)--)
			{
				pb=pb->next;
			}
			while(Alength--)
			{
				if(pa==pb)
				{
					res=pa->a;
					break;
				}
				pa=pa->next;
				pb=pb->next;
			}
		}
		printf("相较于节点元素:%c",res);
	}
} 

/*
	创建相交的两条链表 
	相交节点Nnode
	相交节点元素:@ 
*/ 
void createIntersectantList(void)
{
	SListNode Nnode=(SListNode)malloc(sizeof(struct STU));
	Nnode->a=‘@‘;
	Nnode->next=NULL;
	insertElement(Nnode,‘c‘);
 	insertElement(Nnode,‘f‘);
 	insertElement(Nnode,‘r‘);
 	insertElement(Nnode,‘e‘);
 	insertElement(Nnode,‘e‘);
	
	ListA=createAlist(‘A‘);
	insertElement(ListA,‘1‘);
	insertElement(ListA,‘4‘)->next=Nnode;
	
	ListB=createBlist(‘B‘);
	insertElement(ListB,‘5‘);
	insertElement(ListB,‘6‘);
	insertElement(ListB,‘7‘);
	insertElement(ListB,‘8‘)->next=Nnode;
	
	printfList(ListA);
	printfList(ListB);
	
	IsIntersectant(ListA,ListB);
}

int main(void)
{
	createIntersectantList();
}

  

以上是关于判断两个单链表是否相交及相交的第一个节点的主要内容,如果未能解决你的问题,请参考以下文章

判断两条链表是否相交(公共部分)并找出相交处

算法总结之 两个单链表相交的一些列问题

拿捏链表—— 相交链表

1.11判断两个无环单链表是否相交

算法面试

java-----单链表