数据结构--找到两个单链表相交的起始节点

题目描述:如下面的两个链表:

数据结构--找到两个单链表相交的起始节点_第1张图片

在节点 c1 开始相交。

解题思路
首先需要考虑两个链表长度不一样的情况(如果两链表长度相同就当然不需要考虑):这里就需要用到链表的右对齐思想。先找到两个链表中的长链表和短链表。分别让两个指针指向两个链表,让长的链表的指针先走(长链表长度-短链表长度)步,这样就相当于跳过了较长链表的多余部分,则此时两指针遍历完链表所走长度应该是相同的,这就是右对齐思想。
数据结构--找到两个单链表相交的起始节点_第2张图片
关于右对齐代码,可以这么写:

int lenA = 0;
int lenB = 0;
int gap = 0;
SListNode *cur;
//分别定义一个指向较长链表的指针和一个指向较短链表的指针
SListNode *longerlist = headA;//对应图中的fast指针
SListNode *shortlist = headB;//对应图中的slow指针
	//求两个链表的长度
for (cur = headA; cur; cur = cur->next)
{
	lenA++;
}
for (cur = headB; cur; cur = cur->next)
{
	lenB++;
}
gap = abs(lenA - lenB);//求多余部分长度
if (lenA < lenB)
{
	longerlist = headB;
	shortlist = headA;
}
for (; i < gap; i++)//右对齐
{
	longerlist = longerlist->next;
}

然后再让两个指针一起往后遍历,直到找到它们所指向的有相同数据域的节点。两指针都为空时还没找到,就代表没有相同节点。

具体函数代码如下:

SListNode *getPublicPoint(SListNode *headA, SListNode *headB)
{
	int lenA = 0;
	int lenB = 0;
	int gap = 0;
	int i = 0;
	SListNode *cur;
	SListNode *longerlist = headA;
	SListNode *shortlist = headB;
	//求两个链表的长度
	for (cur = headA; cur; cur = cur->next)
	{
		lenA++;
	}
	for (cur = headB; cur; cur = cur->next)
	{
		lenB++;
	}
	gap = abs(lenA - lenB);//求多余部分长度
	if (lenA < lenB)
	{
		longerlist = headB;
		shortlist = headA;
	}
	for (; i < gap; i++)//右对齐
	{
		longerlist = longerlist->next;
	}
	//两指针一起向后遍历
	for (; longerlist&&shortlist; longerlist = longerlist->next, shortlist = shortlist->next)
	{
		if (longerlist->data == shortlist->data)
		{
			return longerlist;
		}
	}
	return NULL;
}

最后附上结构体SListNode

typedef int SLTDataType;
typedef struct SListNode
{
	SLTDataType data;
	struct SListNode *next;
}SListNode;

你可能感兴趣的:(数据结构,C语言基础)