LC160. 相交链表 (双指针+小技巧)

LC 160. 相交链表

题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
分析:  根据提示 A和B链表的长度分别为 m n
          ① 有共同节点时
              我们希望达成的是通过一轮遍历 判断A B的内容是否相等 然后返回相交点   怎么样才能做到相等长度的遍历呢?

            (例: A:a1→a2→c1→c2→c3   B:b1→b2→b3→c1→c2→c3)
                用 p1 遍历A遍历B  a1→a2→c1→c2→c3→b1→b2→b3→c1→c2→c3
                用 p2 遍历B遍历A  b1→b2→b3→c1→c2→c3→a1→a2→c1→c2→c3
              我们会发现 m+n-k = n+m-k  所以可知 在同时便利p1和p2,当第一次p1 = p2时,对应的节点就是相交节点。
          ② 无共同节点时
                我们设置一个标志,如遍历完A之后遍历B,改变标志的值  如果还会进行第二次遍历  则代表没有公共节点

复杂度: 时间复杂度O(m+n)  空间复杂度O(1)

代码:

def getIntersectionNode(headA, headB):
    p1, p2 = headA, headB
    flag = 0
    while p1 != p2:
        if not p1.next:
            if flag == 0:
                p1 = headB
                flag = 1
            else:
                return None
        else:
            p1 = p1.next
        if not p2.next:
            p2 = headA
        else:
            p2 = p2.next
    return p1

 

路虽远,行则将至。事虽难,做则必成 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值