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

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

在这里插入图片描述

在节点 c1 开始相交。

解题思路
首先需要考虑两个链表长度不一样的情况(如果两链表长度相同就当然不需要考虑):这里就需要用到链表的右对齐思想。先找到两个链表中的长链表和短链表。分别让两个指针指向两个链表,让长的链表的指针先走(长链表长度-短链表长度)步,这样就相当于跳过了较长链表的多余部分,则此时两指针遍历完链表所走长度应该是相同的,这就是右对齐思想。
在这里插入图片描述

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

具体函数代码如下:

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 struct SListNode
{
	SLTDataType data;
	struct SListNode *next;
}SListNode;

发布了50 篇原创文章 · 获赞 30 · 访问量 9178

猜你喜欢

转载自blog.csdn.net/qq_42913794/article/details/99674797