查找两个链表的交点2024 年 8 月 29 日 | 阅读 15 分钟 在此问题中,我们将给出两个链表。这两个链表将在两个链表的某个节点处合并,形成一个 Y 形链表。我们需要找到链表合并的节点。 让我们看一些例子来理解这个问题 输入 列表1 = 1 -> 2 -> 3 -> 4 -> 5 列表2 = 9 -> 8 -> 4 -> 5 输出 4 两个列表在两个链表的节点 4 之后合并 方法 - 1解决此问题的最基本方法是使用嵌套循环。外层循环将遍历第一个链表的每个节点,内层 while 循环将遍历第二个链表。内层 while 循环将检查列表 2 的当前节点是否与列表 1 的当前节点相同。如果条件满足,那么我们就找到了交点。如果循环在没有找到交点的情况下结束,那么我们将返回 None。 以下是实现上述方法的 Python 程序。 代码 输出 The intersection node is: 4 时间复杂度:由于使用了嵌套循环,此程序的时间复杂度为 O(m * n)。这里,m 和 n 是两个链表的节点数。 空间复杂度:我们没有使用任何额外的空间,因此空间复杂度是常数。 方法 - 2在此方法中,我们将使用不同的链表结构。我们将对基本结构进行一些修改,这将有助于我们解决此问题。我们将向链表中添加一个新的变量,该变量将存储布尔值 True 或 False。此变量将跟踪节点是否已被访问。 我们将首先遍历第一个链表,并将第一个链表的所有节点标记为已访问。然后,我们将遍历第二个链表。对于每个节点,我们将检查该节点是否已被访问。如果节点已被访问,则表示我们在第一个链表中已访问过该节点,这意味着链表在此特定节点处相交。如果我们已完成第二个链表的遍历而未遇到已被访问的节点,则表示两个链表在任何点都不相交。这种方法比以前的方法更好,因为我们不使用嵌套循环来遍历链表。我们将使用线性遍历来查找节点的交集。 代码 输出 The intersection node is: 4 我们不需要创建一个新变量。我们也可以使用哈希表。 代码 输出 The intersection node is: 4 时间复杂度:我们遍历两个链表一次。为了遍历链表,我们使用了一个线性循环。因此,遍历的时间复杂度是两个链表长度之和。因此,时间复杂度为 O(m + n)。m 和 n 是两个链表的长度。我们取总长度是因为,在最坏的情况下,链表可能没有交集,在这种情况下,将遍历完整的链表。 辅助空间:我们创建了一个列表来存储已被访问过的节点。节点将只存储一次。因此,空间复杂度将是此列表的长度。在最坏的情况下,此列表的长度将为 O( max(m, n) ),其中 max(m, n) 是两个链表中较长链表的长度。 方法 - 3在此方法中,我们将利用两个链表的节点数量差异来找到两个链表的交点。 我们将按照以下步骤解决此问题。
以下是此方法的 Python 代码。 代码 输出 The intersection node is: 4 时间复杂度: O(m + n) 辅助空间: O(1) 方法 - 4在此方法中,我们将使用哈希来查找交点。此方法与我们使用列表存储已访问节点的方法类似,不同之处在于这次我们将使用 HashSet 来存储节点。算法很简单。首先,我们将初始化一个空的哈希集。初始化后,我们将遍历第一个链表并将此链表的所有节点存储在哈希集中。在下一步中,我们将遍历第二个链表,并且对于每个节点,我们将检查该节点是否在哈希集中。如果节点在哈希集中,则表示它是交点节点,因此我们将返回该节点。如果没有交点节点,则函数将返回 False。 代码 输出 The intersection node is: 4 时间复杂度:我们使用两个线性循环,它们将一直迭代直到两个链表都被遍历;因此,程序的时间复杂度为 O( m + n ) 辅助空间:我们使用了额外的空间来存储节点;因此,空间复杂度是线性的,即 O(n)。 方法 - 5在此方法中,我们将使用著名的双指针方法来查找交点。以下是此方法的算法
代码 输出 The intersection node is: 4 时间复杂度:我们使用一个线性循环,它将一直迭代直到两个链表都被遍历;因此,程序的时间复杂度为 O( m + n ) 辅助空间:我们没有创建任何额外的空间来存储任何东西;因此,空间复杂度是常数,即 O(1)。 方法 - 6在此方法中,我们将使用两个堆栈来查找交点。首先,我们将初始化两个堆栈。在下一步中,我们将遍历两个链表并将它们的所有节点添加到每个堆栈中。然后,我们将初始化一个变量,该变量将存储交点。让这个变量为 merge_point = None。我们将启动一个 while 循环,该循环将一直运行,直到堆栈的顶元素不相等为止。在 while 循环内部,我们将弹出堆栈的顶元素并将该节点存储在变量 merge_point 中。当 while 循环结束时,我们将返回 merge_point,它将包含两个链表的交点。如果链表没有交点,那么 while 循环将不会执行,并且将返回 merge_point = None。 代码 输出 The intersection node is: 4 时间复杂度:我们遍历两个链表一次。为了遍历链表,我们使用了一个线性循环。因此,遍历的时间复杂度是两个链表长度之和。因此,时间复杂度为 O(m + n)。m 和 n 是两个链表的长度。在最坏的情况下,while 循环将花费 O(min(m, n))。因此,平均时间复杂度为 O(m, n)。 辅助空间:我们创建了两个堆栈来存储两个链表的节点。节点将只存储一次。因此,空间复杂度将是两个堆栈的总长度。因此,空间复杂度将为 O(m + n)。 下一个主题两个排序数组的中位数 Python 解法 |
NumPy,简称 Numerical Python,是 Python 中进行数值和科学计算的基础库之一。它最强大的特性之一是通用函数(通常称为“ufuncs”)的概念。NumPy 中的 Ufuncs 允许对数组进行高效的逐元素操作,使其成为...
阅读 6 分钟
Firebase 是 python 提供的一个库,用于使用 Firebase 提供的各种服务,因此为了更好地理解 Firebase 库,我们需要首先了解 Firebase 及其提供的不同服务...
阅读 22 分钟
嵌套元组是 Python 元组,它被放置在另一个元组中。让我们看下面的 8 元素元组。tuple = (12, 23, 36, 20, 51, 40, (200, 240, 100)) 这个最后一个元素由三个项组成,用括号括起来,是...
阅读 3 分钟
在本教程中,我们将编写一个 Python 程序,返回数组乘积的符号。这是一个简单的 leetcode 问题,可能会在技术面试中被问到。让我们来理解问题陈述。问题陈述 示例 - 1 输入: nums = [-1,-2,-3,-4, 3, 2, 1] 输出: 1 示例...
阅读 2 分钟
借助前进和后退按钮,图像查看器应用程序的用户可以在图像之间导航并一次查看一张图像。让我们按照几个简单的步骤在 Python 中构建一个图像查看器应用程序。有关图像查看器应用程序的信息:该应用程序……
阅读 6 分钟
数据分析项目展示了从定位信息源到清洗和处理数据的整个分析过程。如果您正在寻找您的第一个数据管理职位,项目可以帮助您练习使用各种商业智能工具和方法。最好的项目会研究那些关系...
21 分钟阅读
在本教程中,我们将学习 Python 中的 currying,这是一个在 Python 中比较新的概念。大多数开发者可能不熟悉这个主题。我们将解释 currying 的概念、它的用例以及如何在 Python 中实现它。让我们开始……
阅读 6 分钟
Apriori 算法是一种机器学习算法,用于理解各种产品之间的关系模式。该算法最流行的用途是根据用户购物车中已有的商品来推荐商品。沃尔玛特别使用了该算法...
5 分钟阅读
在本教程中,我们将学习如何格式化输出。格式化和输出是指呈现程序的输出。我们可以将输出格式化为人类可读的形式,或者将数据写入文件以及其他一些指定形式。有时我们需要...
阅读 4 分钟
在本教程中,我们将编写 Python 程序来检查给定的链表是否为循环链表。我们将了解确定循环链表的各种高效方法。我们假设您熟悉基本...
阅读 6 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India