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


题目:

 

 

 

 

解答:

方法一:双指针法

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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM