剑指52

Posted rookiez

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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 };

 

以上是关于剑指52的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer52:正则表达式匹配(Java)

乱序版 ● 剑指offer每日算法题打卡题解—— 双指针(题号18,22,25,52)

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

剑指52

[8月4日]剑指 Offer 52. 两个链表的第一个公共节点

[8月4日]剑指 Offer 52. 两个链表的第一个公共节点