剑指52 两个链表的第一个公共节点

输入两个链表,找出它们的第一个公共节点。

 

普通办法,对A链表每个节点都遍历B链表,看有没有相同,时间复杂度mn。

用空间换时间,因为链表只要遇到第一个相同的节点,后面的节点都相同,也就是说可以从链表尾往回找。但是因为缺乏往回的指针,所以使用栈,两个栈分别把两个链表的所有节点压进去,然后再一对一对弹出并检查,时间复杂度max(m,n),需要m+n的辅助空间。

其实这也可以使用双指针,两个指针保持相同的距离。先遍历一遍两个链表记录他们的长度,长度差为diff,让长的那一侧先走diff,然后两个同步前进,遇到的第一个相同的节点就是答案。

 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     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
12         if(headB==nullptr || headA==nullptr)
13             return nullptr;
14         ListNode* dummyA=headA,*dummyB=headB;
15         int lena=0,lenb=0;
16         while(headA!=nullptr){
17             headA=headA->next;
18             lena++;
19         }
20         while(headB!=nullptr){
21             headB=headB->next;
22             lenb++;
23         }
24         int diff=lenb-lena;
25         while(diff>0){
26             dummyB=dummyB->next;
27             diff--;
28         }
29         while(diff<0){
30             dummyA=dummyA->next;
31             diff++;
32         }
33         while(dummyA!=nullptr){
34             if(dummyA==dummyB)
35                 break;
36             dummyA=dummyA->next;
37             dummyB=dummyB->next;
38         }
39         return dummyB;
40     }
41 };

 

posted @ 2020-07-06 09:42  __rookie  阅读(155)  评论(0编辑  收藏  举报