题目
思路
hash表
我们将一个链表中的所有结点加入到一个hash表中,遍历第二个链表检查其中结点是否在hash表中,找到的第一个在hash表中的结点就是两个链表的交叉点。
裁剪和比较
我们遍历两个链表分别求出其长度,然后计算出长度差h
。接着,我们使用两个指针分别指向短链表的头部结点以及长链表的第h
个结点。之后,同步一同两个指针,如果指向同一个结点则为两个链表相交的结点。
纯双指针
使用两个指针a,b
分别指向两个链表的头部headA, headB
,并同步移动指针。当a == b
时,返回a
,否则当a == nullptr
时,重新设置a = headA
, b
同理。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* a = headA;
ListNode* b = headB;
if (a == nullptr || b == nullptr) {
return nullptr;
}
while(a != b) {
a = (a == nullptr)? headA : a->next;
b = (b == nullptr)? headB : b->next;
}
return a;
}
};