读书人

微软的一道算法题,该怎么处理

发布时间: 2012-02-23 22:01:34 作者: rapoo

微软的一道算法题
两个单向链表,有可能交叉,请设计算法判断是否交叉,如果交叉,返回交叉点!

算法复杂度o(n)

[解决办法]
两个链表最后是合并成一个 而不是交叉 所以:
(1)先找到p1,p2的最后一个节点,同时记录节点数量a,b;
(2)判断最后一个节点是否相同,

如果不相同则没相交。
如果相同 则从第一个节点和|a-b|+1个节点开始比较 看是否相等 不相等都寻找下一个节点
直到找到交叉点

[解决办法]
先分别遍历二个链表p1,p2,并记录各自长度a1,a2;
比较最后的结点地址是否相同,如果不同说明没有交叉,如果相同,说明有交叉,
然后比较 a1,a2大小,将大者的链表往前走|a1-a2|步,然后,从此结点开始和小者链表的头结点比较是否相等,如果相等,为所求结点,不相等,都前进一步,继续比较,直到找到结点
算法时间复杂点O(n)

[解决办法]
昨天搞得太晚了。

非常同意 red_berries(我再顶顶) 的,的确比我昨晚说的那个要好得多。

若链表类中有指向尾结点的指针,则先比较尾结点指针再后续,否则直接从相等长度的那点(短的从头开始,长的先行一段长度差,正是red_berries(我再顶顶)所想)逐步比较。的确比我那个要省约一半时间,且不浪费空间。

读书人网 >C++

热点推荐