腾讯面试题:两个链表相交,求开始相交的点
腾讯的技术面试很喜欢问算法类的问题,准备去腾讯面试前,要好好看下算法的东西。
这题如果求两个链表是否相交,或者求相交的终点好求,要求开始相交的点,不好求。
刚开始我的思路一直停留再相交的终点做文章,比如,
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;
}
---------------------
作者:3h随然吧
来源:CSDN
原文:https://blog.csdn.net/hhh3h/article/details/38596579
版权声明:本文为博主原创文章,转载请附上博文链接!