两个单链表相交,求开始相交的点

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

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

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

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

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 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/ma969070578/article/details/88057166