首页 > 其他 > 详细

面试题52. 两个链表的第一个公共节点

时间:2020-05-09 19:58:30      阅读:54      评论:0      收藏:0      [点我收藏+]

题目:

技术分享图片

 

 技术分享图片

 

 

解答:

方法一:双指针法

(1)创建两个指针 pA 和 pB,分别初始化为链表 A 和 B 的头结点。然后让它们向后逐结点遍历。

(2)当 pA到达链表的尾部时,将它重定位到链表 B 的头结点 (你没看错,就是链表 B); 类似的,当 pB 到达链表的尾部时,将它重定位到链表 A 的头结点。

(3)若在某一时刻 pA 和 pB相遇,则pApB 为相交结点。

(4)想弄清楚为什么这样可行, 可以考虑以下两个链表: A={1,3,5,7,9,11} 和 B={2,4,9,11},相交于结点 9。 由于 B.length (=4) < A.length (=6),pB 比 pA 少经过 22 个结点,会先到达尾部。将 pB重定向到 A 的头结点,pA重定向到 B 的头结点后,pB要比 pA多走 2 个结点。因此,它们会同时到达交点。

如果两个链表存在相交,它们末尾的结点必然相同。因此当 pApA/pBpB 到达链表结尾时,记录下链表 A/B 对应的元素。若最后元素不相同,则两个链表不相交。

复杂度分析

时间复杂度 : O(m+n)O(m+n)。
空间复杂度 : O(1)O(1)。

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11  
12     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) 
13     {
14         if (NULL == headA || NULL == headB)
15         {
16             return NULL;
17         }
18 
19         ListNode *pA = headA;
20         ListNode *pB = headB;
21         
22         while (pA != pB)
23         {
24             pA = (pA == NULL ? headB : pA->next);
25             pB = (pB == NULL ? headA : pB->next);
26         }
27 
28         return pA;
29     }
30 };

 

面试题52. 两个链表的第一个公共节点

原文:https://www.cnblogs.com/ocpc/p/12859533.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!