力扣160.相交链表双指针python

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

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


题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

自定义评测:

评测系统 的输入如下(你设计的程序 不适用 此输入):

  • intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0
  • listA - 第一个链表
  • listB - 第二个链表
  • skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数
  • skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数

评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。
解题思路
很有意思的一道题目。首先肯定可以想到的是储存遍历过的节点,做法类似141题环形链表,但是要求仅用O(1)内存去做,虽然知道要用双指针,但没想到怎么遍历。

看了官方题解确实奇思妙想。p_a指针先遍历列表A,A遍历完了就去遍历B;p_b指针先遍历B,B遍历完了去遍历A。在p_a遍历B和p_b遍历A的时候,如果有相交节点两个指针就能在这里碰到了。这里稍微解释一下:

因为a、b两个列表可以分为两段:
a分为 a不与b相交那一段 + a、b相交的一段
b分为 b不与a相交那一段 + a、b相交的一段

当两个指针走到相交节点时:
p_a走过了 a不与b相交那一段 + a、b相交的一段 + b不与a相交那一段
p_b走过了 b不与a相交那一段 + a、b相交的一段 + a不与b相交那一段

可以看到两个指针所走的路程是一样的,所以可以同时抵达。

具体实现如下:


class Solution(object):
    def getIntersectionNode(self, headA, headB):
        """
        :type head1, head1: ListNode
        :rtype: ListNode
        """
        head1 = headA
        head2 = headB
        while head1 != head2:
            head1 = head1.next if head1 else headB
            head2 = head2.next if head2 else headA
        return head1

————————————————
版权声明:本文为CSDN博主「KeEN丶X」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/KeEN_Xwh/article/details/108169312

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值