单链公共结点问题

来源:互联网 发布:保险网络大学认证教育 编辑:程序博客网 时间:2024/06/05 13:22

本总结是是个人为防止遗忘而作,不得转载和商用。

题目

         给定两个单向链表,计算两个链表的第一个公共结点,若没有公共节点,返回空。

这道题的渊源

                  

         这道题的渊源如上图所示,求A和B的最近共同祖先(即上图蓝色箭头所示的那个点),即:“A到根节点的路线”和“B到根节点的路线”相遇的离A和B最近的点。

         而“A到根节点的路线”和“B到根节点的路线”是两个单向链表,因此这就是求两个单向链表的第一个公共节点。

分析

 既然这两个是单向链表,那一旦两链表相交后就再也无法分开了,如下图所示:

                                    

         既然如此,那就这样做:

                   假设两链表的长度为m和n(m>n),由于两个链表从第一个公共结点到链表的尾结点是完全重合的。所以前面的(m-n)个结点一定没有公共结点,如上图所示。

         即:

                   因此先分别遍历两个链表得到它们的长度m,n。

令长链表空转|m-n|次(到达上图所示的竖线位置),然后同步遍历两链表,直到找到相同结点(上图所示的O)或到链表结束。

复杂度

         时间复杂度是O(m+n);

 

扩展

         对于链表存在环,如下图(另一个链表就不画了,反正两个链表有个交点):

                  

         这时在计算共同节点的话就需要:

                   两个指针p和q分别指向两个链表的表头,然后同时一个p++,一个(q++)++的同时向后走,最后当p=q时返回就好,这时就是共同节点。

0 0
原创粉丝点击