LeetCode 面试题 02.07. 链表相交

devtools/2024/10/20 12:27:12/

题目描述

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

例如:

输入:headA = [4,1,8,4,5], headB = [5,6,1,8,4,5]
输出:Intersected at '8'

解题思路

我们要找到两个单链表相交的起始节点,这样的节点从它开始,链表A和链表B共享相同的节点。从链表的末尾开始相同的节点会一直持续,直到到达相交节点。

双指针遍历

双指针法可以有效地解决这个问题:

  1. 初始化两个指针:指针 pA 指向 headA,指针 pB 指向 headB
  2. 遍历链表:依次遍历 A 链表和 B 链表,在遍历到末尾(即 nullptr)时,切换到另一个链表继续遍历。具体来说:
    • 如果 pA 到达 nullptr,则让 pA 指向 headB 重新开始遍历链表B。
    • 同样,如果 pB 到达 nullptr,则让 pB 指向 headA 重新开始遍历链表A。
  3. 找到相交节点:继续上述过程,直到 pA 和 pB 相遇,这个相遇点即为相交节点。如果两个指针没有相遇且都遍历完了两个链表,则返回 nullptr 表示没有相交节点。

原理解释

通过将两个指针从链表A和链表B切换,使它们走到相同的距离。如果存在相交节点,两个指针最终会在相交节点相遇。这个方法确保两个指针走过相同的节点总数,有效地消除了长度差异。

算法实现

C++实现

/*** 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*curA=headA;ListNode*curB=headB;int lenA=0,lenB=0;while(curA!=NULL){lenA++;curA=curA->next;}while(curB!=NULL){lenB++;curB=curB->next;}curA=headA;curB=headB;if(lenA<lenB){swap(lenA,lenB);swap(curA,curB);}int nap=lenA-lenB;while(nap--){curA=curA->next;}while(curA!=NULL){if(curA==curB){return curA;}curA=curA->next;curB=curB->next;}return NULL;}
};

复杂度分析

  • 时间复杂度:O(m + n),其中 m 和 n 分别是两个链表的长度。两个指针各自遍历两个链表,总共走了m + n的节点数。
  • 空间复杂度:O(1),只使用了常数额外空间,没有使用额外的数据结构。

总结

通过使用双指针遍历的方法,我们可以在不改变链表结构和节点值的情况下,找到两个单链表的相交节点。这种方法高效、简单,非常适合解决链表相交问题。

希望这篇文章能帮助你更好地理解和解决链表相交的问题。如果有任何问题,欢迎随时讨论与交流。


http://www.ppmy.cn/devtools/127286.html

相关文章

Redis7 数据类型

Redis7 数据类型 文章目录 Redis7 数据类型1. Redis键&#xff08;Key&#xff09;2. Redis字符串&#xff08;String&#xff09;3. Redis列表&#xff08;List&#xff09;4. Redis哈希表&#xff08;Hash&#xff09;5. Redis集合&#xff08;Set&#xff09;5.1 常用操作5.…

MFC工控项目实例二十六创建数据库

承接专栏《MFC工控项目实例二十五多媒体定时计时器》 用选取的型号为文件名建立文件夹&#xff0c;再在下面用测试的当天的时间创建文件夹&#xff0c;在这个文件中用测试的时/分/秒为数据库名创建Adcess数据库。 1、在StdAfx.h文件最下面添加代码 #import "C:/Program F…

展示图片--系统篇

这个标题包含了系统篇3个字&#xff0c;是什么意思呢&#xff1f;我在这里做出解释&#xff0c;系统篇意指包含前台和后台的关联性功能实现&#xff0c;同时重心放在逻辑解释上。 可能会有人好奇&#xff0c;既然有系统篇&#xff0c;那么相对系统篇还有哪些篇呢&#xff1f;这…

使用 SSH 连接 GitLab 的常见问题及解决方案

使用 SSH 连接 GitLab 的常见问题及解决方案 在使用 SSH 连接到 GitLab 服务器时&#xff0c;可能会遇到类似于以下的错误信息&#xff1a; git192.168.xx.xxx: Permission denied (publickey).这个错误通常表示 SSH 无法验证你的公钥&#xff0c;导致无法访问 GitLab 仓库。…

嵌入式入门学习——6Protues点亮数码管,认识位码和段码,分辨共阴还是共阳(数字时钟第一步)

0 系列文章入口 嵌入式入门学习——0快速入门&#xff0c;Let‘s Do It&#xff01; 首先新建基于Arduino UNO的protues工程&#xff0c;见本系列第3篇文章 1 点“P”按钮找器件 2 输入“seg”或“digit”查找数码管器件 3 找到我们想要的6位7段数码管 4如图A、B…DP都是段码…

数据结构--二叉树随记

二叉树主要分为四类&#xff1a;满二叉树、完全二叉树、二叉搜索树、平衡二叉搜索树。 高度,深度,层 满二叉树 满二叉树就是每一层节点都是满的&#xff0c;整棵树像一个正三角形&#xff1a; 满二叉树有个优势&#xff0c;就是它的节点个数很好算。假设深度为 h&#xff0c;那…

1. 安装框架

一、安装 Laravel 11 框架 按照官方文档直接下一步安装即可 1. 安装步骤 2. 执行数据库迁移 在.env文件中提前配置好数据库连接信息 php artisan migrate二、安装 Filament3.2 参考 中文文档 进行安装 1. 安装 拓展包 composer require filament/filament:"^3.2" -W…

即时通讯:群消息的读、写扩散问题

在即时通讯&#xff08;IM&#xff09;项目的开发中&#xff0c;群聊消息的传播机制可以分为两种主要模式&#xff1a;读扩散和写扩散。这两种模式各有优缺点&#xff0c;适用于不同的场景和需求&#xff0c;尤其在群聊消息的发送和接收环节&#xff0c;它们对系统的性能和可扩…