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

来源:互联网 发布:vivo手机怎么备份数据 编辑:程序博客网 时间:2024/06/10 08:35

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


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

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

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

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;}





0 0
原创粉丝点击