leetcode160.相交链表

文章介绍了两种解决相交链表问题的方法:双指针法和哈希表法。双指针法通过调整链表起始点距离,同步遍历找到相交点;哈希表法通过存储第一个链表的节点,然后在遍历第二个链表时查找相同的节点。两种方法时间复杂度均为O(m+n),但空间复杂度不同,双指针法为O(1),哈希表法为O(m)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

  • 相交链表是指两个单向链表在某个节点处相交,之后形成了共同的后续部分。通常,两个链表的长度不相等。在相交节点之前,两个链表的节点数可能不同,但在相交节点之后,两个链表的节点数必须相等。找到两个相交链表的交点是一个经典的问题,可以使用双指针或哈希表等方法解决。

双指针法

  • 双指针法是解决相交链表问题的常用方法,步骤如下:
  1. 分别遍历两个链表,获取它们的长度。

  2. 让较长的链表先走多出来的步数,使得两个链表的起始点到相交点的距离相等。

  3. 同时遍历两个链表,直到找到第一个相同的节点,即为相交点。

  4. 如果没有找到相交点,则说明两个链表不相交。

双指针法的时间复杂度为 O(m+n),其中 m 和 n 分别为两个链表的长度。在空间复杂度上,只需要常数级别的额外空间,因此是一种较为高效的解决方法。

哈希表法

  • 哈希表也是解决相交链表问题的常用方法,步骤如下:
  1. 遍历第一个链表,将每个节点的地址存入哈希表中。

  2. 遍历第二个链表,每次遍历到一个节点时,在哈希表中查找是否存在相同的节点地址。

  3. 如果存在相同的节点地址,则说明两个链表相交,返回该节点地址即可。

  4. 如果遍历完第二个链表仍未找到相交点,则说明两个链表不相交。

哈希表法的时间复杂度为 O(m+n),其中 m 和 n 分别为两个链表的长度。在空间复杂度上,需要额外的哈希表空间,因此空间复杂度较高。但是,哈希表法适用于链表中存在重复节点的情况,而双指针法则不适用。

/**
 * 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) {
        if( (!headA) || (!headB)){
            return NULL;
        }
        while(headA){
             myset.insert(headA);
            headA = headA->next;
        }
        while(headB){
            auto res = myset.find(headB);
            if(res!=myset.end()){
                return headB;
            }
            headB = headB->next;
        }
        return NULL;
    }
private:
    set<ListNode*> myset;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值