50. 腾讯面试题:两个单链表相交,求开始相交的点

腾讯面试题:两个链表相交,求开始相交的点


腾讯的技术面试很喜欢问算法类的问题,准备去腾讯面试前,要好好看下算法的东西。

这题如果求两个链表是否相交,或者求相交的终点好求,要求开始相交的点,不好求。

刚开始我的思路一直停留再相交的终点做文章,比如,

1)知道终点,就知道终点的上一个点,判断它是不是,再找上上一个点,以此类推。。。可惜这是个单链表,不能逆向遍历。

       使用这种办法,就需要遍历n遍,效率太太低。

2)终点的next指针,只想首指针,这样找。。。


后面想了很久,想到了方法。

先遍历两个链表,求得它们的长度,n, m,    长度长得链表先走 |n-m| 步,再同时走,没走一步都看指针是否相等,相等则为首次相交得点,跳出循环。

List* find first(List* l1, List*l2)
{
	int len1 = 0, len2 = 0;
	List* p = l1;
	while( p )
	{
		p = p->next;
		len1 ++;
	}
	p = l2;
	
       while( p )
	{
		p = p->next;
		len1 ++;
	}
	List* p1 = l1;
	List* p2 = l2;
	int k = 0;
	if(len1 > len2)
	{
		while(k < len1 - len2)
		{
			p1 = p1->next;
			k ++;
		}
	}
	else if(len1 < len2)
	{
		while(k < len1 - len2)
		{
			p1 = p1->next;
			k ++;
		}
	}

	while(p1)
	{
		if(p1 == p2) 
			return p1;
		p1 = p1->next;
		p2 = p2->next;
	}

	return NULL;
}





你可能感兴趣的:(C/C++语言,面试题集及解答)