首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >两个链表的第一个公共结点

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

作者头像
猿人谷
发布2018-01-17 10:29:47
4090
发布2018-01-17 10:29:47
举报
文章被收录于专栏:猿人谷猿人谷猿人谷

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

链表结点定义如下:

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;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-03-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档