剑指Offer52.两个链表的第一个公共节点
难度:中等
题目
注意:
- 如果两个链表没有交点,返回 null.
- 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
- 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
- 本题与主站 160 题相同:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
分析
这道题比较容易想到的是,创建一个hash表,然后循环依次A,将A的所有节点添加至Hash表中。
再循环依次B,每次判断B的当前节点是否在hash表中。
代码如下:
class Solution:
def getIntersectionNode(self, headA, headB):
d = {}
while headA:
d[headA] = headA
headA = headA.next
while headB:
if d.get(headB):
return headB
headB = headB.next
return None
这样的思路可以通过,但是题目说了程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
hash表构造了额外的O(n)空间复杂度,那么如何来实现使用O(1)的时间复杂度完成呢?来看看下面的图:
如果两个链表相交,那么:X + 1 + Z + Y 必然等于 Y + 1 + Z + X
所以我们可以使用上图的方式,通过双指针的解法,来完成这道题目。具体代码如下:
class Solution:
def getIntersectionNode(self, headA, headB):
x, y = headA, headB
while x != y:
x = x.next if x else headB
y = y.next if y else headA
return x
欢迎关注我的公众号: 清风Python,带你每日学习Python算法刷题的同时,了解更多python小知识。
我的个人博客:https://qingfengpython.cn
本文介绍了如何使用双指针法解决寻找两个链表的交点问题,满足O(n)时间复杂度和O(1)内存限制。通过让两个指针分别从头节点开始,不同链表的指针在遇到终点时转向另一个链表,直到两个指针相遇,即可找到交点。这种方法避免了使用额外的数据结构,提高了效率。
296

被折叠的 条评论
为什么被折叠?



