今天开始我要速通TOP100! —— 沃兹基 · 硕德
目录
直观解法1
求两个链表的相交节点,直觉做法就是创建一个哈希集合存储其中一条链表的节点,再遍历另一个链表去寻找第一个出现在哈希集合中的节点,不存在就返回nullptr
由此可得出代码
ListNode* getIntersectionNode(ListNode *headA, ListNode *headB) {
unordered_set<ListNode*> cache;
while(headA)
{
cache.insert(headA);
headA = headA->next;
}
while(headB)
{
if(cache.count(headB))
return headB;
headB = headB->next;
}
return nullptr;
}
基于题目数学特性解法2
ListNode* getIntersectionNode(ListNode *headA, ListNode *headB) {
if(!headA || !headB)
return nullptr;
ListNode* pA = headA, *pB = headB;
while(pA != pB)
{
pA = pA == nullptr ? headB : pA->next;
pB = pB == nullptr ? headA : pB->next;
}
return pA;
}
假设链表A到达交点需走a步,链表B到达交点需走b步,从公共交点到达末尾要走c步
那么A链表遍历完需要走a + c步,B链表需要走b + c步
此时如果A链表再走b步,B链表再走a步,双方所走步数就会相同,值得注意的是虽然我们并没有使用任何计数器去记录步数,但由于我们知道
a代表着A链表在到达交点前的长度
b代表着B链表在到达交点前的长度
因此只需要在双方进行遍历,走到链表尾部时,立刻将遍历指针指向对方链表头部继续遍历即可
情况分析
如果双方没有交点
且链表长度相等:双方会在将指针指向对方头结点之前同时等于nullptr,结束循环
且链表长度不相等:双方指针会各自完整遍历一遍两个链表,并同时指向nullptr
如果双方有交点
且链表长度相等:双方会在第一次遍历时得到交点
且链表长度不相等:双方会在互相遍历完自己的链表后,遍历对方链表时得到交点