微软100题(62)找出链表的第一个公共结点

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

链表的结点定义为:
struct ListNode

{

      int         m_nKey;

      ListNode*   m_pNext;

};


思路:如果有公共结点,那么从公共结点之后都是一样的,假设一个长m,一个长n,那么这两个之间的差值之前的结点不可能是公共的,所以长的一个先走差值,然后两个一起走 判断


int GetListLength(ListNode* head)
{
	int len =0;
	ListNode* pnode = head;
	while (pnode!=NULL)
	{
		len++;
		pnode = pnode->m_pnext;
	}
	return len;
}
ListNode* FindTheFirstCommon(ListNode* phead1,ListNode* phead2)
{
	int len1 = GetListLength(phead1);
	int len2 = GetListLength(phead2);
	int lendiff = len1 - len2;
	ListNode* plonglist = phead1;
	ListNode* pshortlist = phead2;
	if(len2 > len1)
	{
		plonglist = phead2;
		pshortlist = phead1;
		lendiff = len2 - len1;
	}
	for (int i=0;i<lendiff;++i)
		plonglist = plonglist->m_pnext;
	while (plonglist!=NULL && pshortlist!=NULL && plonglist != pshortlist)
	{
		plonglist = plonglist->m_pnext;
		pshortlist = pshortlist->m_pnext;
	}
	ListNode* common = plonglist;
	return common;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值