两个链表的第一个公共结点

简介: 题目:输入两个链表,找出它们的第一个公共结点。 链表结点定义如下: struct ListNode { int m_nKey; ListNode *m_pNext; };   解决办法:首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个结点。

 

题目:输入两个链表,找出它们的第一个公共结点。

链表结点定义如下:

struct ListNode
{
    int m_nKey;
    ListNode *m_pNext;
};

 

解决办法:首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个结点。在第二次遍历的时候,在较长的链表上先走若干步,接着再同时在两个链表上遍历,找到的第一个相同的结点就是它们的第一个公共结点。

 

ListNode *FindFirstCommonNode(ListNode *pHead1, ListNode *pHead2)
{
	//得到两个链表的长度
	unsigned int nLength1 = GetListLength(pHead1);
	unsigned int nLength2 = GetListLength(pHead2);
	int nLengthDif = nLength1 - nLength2;

	ListNode *pListHeadLong = pHead1;
	ListNode *pListHeadShort = pHead2;
	if(nLength2 > nLength1)
	{
		pListHeadLong = pHead2;
		pListHeadShort = pHead1;
		nLengthDif = nLength2 - nLength1;
	}
	
	//先在长链表上走几步,再同时在两个链表上遍历
	for(int i = 0; i < nLengthDif; ++i)
	{
		pListHeadLong = pListHeadLong->m_pNext;
	}

	while((pListHeadLong != NULL) && (pListHeadShort != NULL) && (pListHeadLong != pListHeadShort))
	{
		pListHeadLong = pListHeadLong->m_pNext;
		pListHeadShort = pListHeadShort->m_pNext;
	}

	//得到第一个公共结点
	ListNode *pFirstCommonNode = pListHeadLong;

	return pFirstCommonNode;
}

unsigned int GetListLength(ListNode *pHead)
{
	unsigned int nLength = 0;
	ListNode *pNode = pHead;
	while(pNode != NULL)
	{
		++nLength;
		pNode = pNode->m_pNext;
	}

	return nLength;
}

 

 

 

 

 

 

img_e00999465d1c2c1b02df587a3ec9c13d.jpg
微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

目录
相关文章
【面试必刷TOP101】删除链表的倒数第n个节点 & 两个链表的第一个公共结点
【面试必刷TOP101】删除链表的倒数第n个节点 & 两个链表的第一个公共结点
49 0
|
6月前
查找两个链表的第一个公共结点
查找两个链表的第一个公共结点
41 0
剑指offer(C++)-JZ52:两个链表的第一个公共结点(数据结构-链表)
剑指offer(C++)-JZ52:两个链表的第一个公共结点(数据结构-链表)
剑指offer 54. 两个链表的第一个公共结点
剑指offer 54. 两个链表的第一个公共结点
71 0
|
JavaScript 算法 前端开发
处理链表的本质,是处理链表结点之间的指针关系
处理链表的本质,是处理链表结点之间的指针关系
99 0
|
Java 测试技术
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。(Java语言实现)
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。(Java语言实现)
169 0
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。(Java语言实现)
7.找出两个链表的第一个公共结点
输入两个链表,找出它们的第一个公共结点。
67 0