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

题目描述

 

 

 

 

 

 

解法一

双指针

思路:如果两个指针不相等,一个指针遍历完链表后跳到另外一个链表的头指针,两个指针走的路程相等。

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
            ListNode *t1 = headA, *t2 = headB;
            if(headA == nullptr || headB == nullptr){
                return nullptr;
            }
            while(t1 != t2){
                t1 = t1 == nullptr ? headB : t1->next;
                t2 = t2 == nullptr ? headA : t2->next;
            }
            return t1;
    }
};

 

解法二

哈希集合

思路:遍历headA,将链表中每个节点加入哈希集合中,然后遍历headB

如果当前节点不在哈希集合中,则继续遍历下一个节点;

 

如果当前节点在哈希集合中,则后面的节点都在哈希集合中,即从当前节点开始的所有节点都是两个链表的公共节点,因此在链表
headB 中遍历到的第一个在哈希集合中的节点就是两个链表的第一个公共节点,返回该节点。

如果链表 headBheadB 中的所有节点都不在哈希集合中,则两个链表不相交,返回 null。

 

 

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
     //定义了一个指针类型的哈希集合 unordered_set
<ListNode *> set; ListNode *temp = headA; while (temp != nullptr) { set.insert(temp); temp = temp->next; } temp = headB; while (temp != nullptr) {
       //count(key) 在容器中查找值为key的元素个数
if (set.count(temp)){ return temp; } temp = temp->next; } return nullptr; } };

 

posted @ 2023-03-06 20:17  盏茶  阅读(19)  评论(0)    收藏  举报