链表相交

判断两个链表是否相交???

我们先来分析一下两个链表的相交问题,如图:

两条链表都不带环:

一条链表带环,一条不带环:

两条链表都带环:

//如果两个链表都不带环
int NotCycleCheckCross(pLinkNode head1,pLinkNode head2)
{
	pLinkNode list1 = head1->next;
	pLinkNode list2 = head2->next;
	if ((NULL==list1 )||(NULL==list2))
	{
		return 0;      //不相交
	}
	while (NULL != list1->next)
	{
		list1 = list1->next;
	}
	while (NULL != list2->next)
	{
		list2 = list2->next;
	}
	if (list1==list2)
	{
		return 1;      //相交
	}
	return 0;          //不相交
}

//链表带环,判断两个链表是否相交
int CycleCheckCross(pLinkNode meet1, pLinkNode meet2)
{
	pLinkNode cur = meet1->next;
	if (meet1 == meet2)
	{
		return 1;     //链表相交
	}
	while ((cur != meet1)&&(cur!=meet2))
	{
		cur = cur->next;
	}
	if (cur == meet2)
	{
		return 1;   //链表相交
	}
	return 0;       //不相交
}

//将上面两个函数封装成一个函数
int CheckCross(pLinkNode head1, pLinkNode head2)          //参数为两个头结点
{
	pLinkNode fast = NULL;
	pLinkNode slow = NULL;
	pLinkNode meet1 = NULL;
	pLinkNode meet2 = NULL;
	if (head1->next == NULL || head2->next == NULL)
	{
		return 0;          //至少一个链表为空链表,则两个链表一定不相交
	}
	fast = head1->next;
	slow = head1->next;
	while (fast&&fast->next)           //判断链表head1是否带环
	{
		fast = fast->next->next;
		slow = slow->next;
		if (fast == slow)
		{
			meet1 = fast;
			break;
		}
	}
	fast = head2->next;
	slow = head2->next;
	while (fast&&fast->next)           //判断链表head2是否带环
	{
		fast = fast->next->next;
		slow = slow->next;
		if (fast == slow)
		{
			meet2 = fast;
			break;
		}
	}
	if ((meet1 == NULL) && (meet2 == NULL))       //如果两个链表都不带环
	{
		return NotCycleCheckCross(head1, head2);
	}
	else if (meet1&&meet2)                        //如果两个链表都带环
	{
		return CycleCheckCross(meet1, meet2);
	}
	//如果两个链表一个带环一个不带环,则一定不相交直接返回0
	return 0;            //不相交
}
时间: 2024-10-17 10:06:44

链表相交的相关文章

如何判断链表相交

链表相交:对于链表而言,两个链表如果相交就会合并成一个后继,之后后继成为一个链表.根据相交的理论可以建立出两个简单的链表相交. 当用户在第一个链表中输入10的那个点作为要相交的那个点,第二个链表输入零之后就与第一个链表的10那个点相交. 代码如下: 1 #include <stdio.h> 2 typedef struct Linklist{ 3 int num; 4 struct Linklist *next; 5 }list; 6 7 struct Linklist *in; 8 9 vo

两个链表相交以及第一个公共节点的问题

判读两个链表是否相交以及如果相交它们的第一个公共节点的问题,主要分这么几种情况: 1)两个链表均不含有环 2)两个链表均含有环 对于一个有环一个没有,那么它们即不相交也没有公共节点 首先定义节点的结构 struct Node { int value; Node *next; }; 判断链表是否有环函数 bool isRingList(Node *head) { if(NULL == head) return false; Node *p1 = head, *p2 = p1->next; whil

链表相交问题:判断两个链表是否相交,若相交求交点

默认为不带环链表,若带环则延伸为判断链表是否带环,若带环,求入口点 看看两个链表相交到底是怎么回事吧,有这样的的几个事实:(假设链表中不存在环) (1)一旦两个链表相交,那么两个链表中的节点一定有相同地址. (2)一旦两个链表相交,那么两个链表从相交节点开始到尾节点一定都是相同的节点. #include<iostream> #include<assert.h> using namespace std; template<class T> struct LinkNode

10.两个单链表相交,计算相交点

10.两个单链表相交,计算相交点 思路1: 分别遍历两个单链表,计算出它们的长度M和N,假设M比N大,则长度M的链表先前进M-N,然后两个链表同时以步长1前进,前进的同时比较当前的元素,如果相同,则必是交点.Node* getIntersectPoint(Node* Head1,Node* Head2) //两链表相交,计算相交点 Node* getIntersectPoint(Node* Head1,Node* Head2) {   int len1=numOfNodes(Head1);  

C语言强化(七)链表相交问题_3 判断链表是否带环

前两篇讨论的前提都是链表是无环的,但是如果链表有环呢? 显然,如果链表有环,那么之前的寻找链表尾结点的函数将陷入死循环,之前的算法也将崩掉. 所以对于链表相交的问题,首先要判断的是链表是否有环. 题目 给出俩个单向链表的头指针,比如 h1,h2,判断这俩个链表是否相交 解题步骤 判断两个[无环]链表是否相交 找到两个[无环]链表的相交结点 判断链表是否带环 判断两个[有环]链表是否相交 找到两个[有环]链表的相交结点 思路 用两个指针,一个指针步长为1,一个指针步长为2,若最后相遇,则链表有环

C语言强化(七)链表相交问题_4 判断两个有环链表是否相交

上一节结束后,我们已经可以判断链表是否有环了,如果无环,那么按照前两节所讲的方法去判断链表是否相交以及获取相交结点,如果有环呢?怎么判断是否相交? 题目 给出俩个单向链表的头指针,比如 h1,h2,判断这俩个链表是否相交 解题步骤 判断两个[无环]链表是否相交 找到两个[无环]链表的相交结点 判断链表是否带环 判断两个[有环]链表是否相交 找到两个[有环]链表的相交结点 思路 对于有环的链表,只要它们相交,则带环的那一段必定完全重复.所以我们只需要在链表一上找到环上的一个结点,判断该结点是否在链

C语言强化(七)链表相交问题_5 找到两个有环链表的相交结点

有环链表是否相交我们也可以判断了,剩下的就是获得有环链表相交结点 题目 给出俩个单向链表的头指针,比如 h1,h2,判断这俩个链表是否相交 解题步骤 判断两个[无环]链表是否相交 找到两个[无环]链表的相交结点 判断链表是否带环 判断两个[有环]链表是否相交 找到两个[有环]链表的相交结点 思路: 显然,有环链表的相交点其实就是环的入口 如图 所以 问题转为求环的入口 直接上理论,具体解释不难,纯粹是一道小学数学追赶问题 若在头结点和快慢指针相遇结点分别设一指针,同步(单步)前进,则最后一定相遇

C语言强化(七)链表相交问题_1 判断无环链表相交

从此篇博文开始,讲解一道古老的链表相交问题,共五篇 题目 给出俩个单向链表的头指针,比如 h1,h2,判断这俩个链表是否相交 解题步骤 判断两个[无环]链表是否相交 找到两个[无环]链表的相交结点 判断链表是否带环 判断两个[有环]链表是否相交 找到两个[有环]链表的相交结点 此篇先从最简单的判断两个[无环]链表是否相交开始,顺便介绍一下链表的基础知识,方便一些对链表不太了解的同学学习. 基础知识 什么是链表? 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指

链表相交以及找循环链表入口

链表相交需要判断有无循环,无循环直接找最后一个节点进行比较,有循环找某个循环点然后看看另一条是否也有这个点. 找循环链表入口比较牛逼:在p2和p1第一次相遇的时候,假定p1走了n步,环路的入口是在h步的时候经过的,那么有  p1走的路径: h+c = n:         c为p1和p2相交点,距离环路入口的距离  p2走的路径: h+c+k*r = 2*n:    r为环路的周长,k是整数显然,如果从h+c点开始,p1再走n步骤的话,还可以回到h+c这个点同时p2从头开始走的话,经过n步,也会