LeeCode_160. 相交链表(双指针+哈希)

一、介绍

1.题目描述

题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

图示两个链表在节点 c1 开始相交

注意事项:

  • 这里的相同是指节点相同,而不是节点的值相同
  • 当出现节点相同,后续节点必相同

2.测试样例

8
[4,1,8,4,5]
[5,6,1,8,4,5]
2
3
# Intersected at '8'

0
[2,6,4]
[1,5]
3
2
# No intersection

二、题解

1、双指针🟢

1、计算两个链表的长度

2、两个链表长度相差 x 个节点,将长链表先移动 x 个节点后再进行比较

  • 比较 p==q,而不是 p->val==q->val
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        // 分别计算两个链表长度
        int n1=0,n2=0;
        ListNode *p1=headA,*p2=headB;
        while(p1!=nullptr){
            n1++;
            p1=p1->next;
        }
        while(p2!=nullptr){
            n2++;
            p2=p2->next;
        }
        // 先让长链表移动 k 个节点,再开始比较
        p1=headA;p2=headB;
        if(n1>n2) for(int i=0;i<n1-n2;i++) p1=p1->next;
        else for(int i=0;i<n2-n1;i++) p2=p2->next;
        // ans记录相交节点,无相交则为空
        ListNode* ans=nullptr;
        while(p1!=nullptr){
            if(p1==p2){
                ans=p1;
                break;
            }
            p1=p1->next; 
            p2=p2->next;
        }
        return ans;
    }
};

2、哈希🟡

1、将第一个链表存入 set

2、遍历第二个链表,看节点是否在 set 中

参考链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/solution/xiang-jiao-lian-biao-by-leetcode-solutio-a8jn/

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        // 将第一个链表存入 set
        set<ListNode*> set;
        ListNode *p=headA,*q=headB;
        while(p!=nullptr){
            set.insert(p);
            p=p->next;
        }
        // 遍历第二个链表,看节点是否在 set 中
        while(q!=nullptr){
            if(set.count(q)) return q;
            q=q->next;
        }
        return nullptr;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值