【LeetCode-链表】相交链表

公众号:深度学习视觉
博客:https://fainke.com
Link:相交链表
语言:Python
难度:简单
描述:找到两个单链表的重合链。比如:

Node_A = [4,1,8,4,5]; Node_B = [5,0,1,8,4,5],则这两个链表的起始节点为8,重合链为[8,4,5]。

Node_A = [4,1,7,2,1]; Node_B = [5,0,1,8,4,5],则这两个链表的起始节点为null,不存在。

方法一:

  1. 将其中一个Node_A链表的所有子链表存储到Set_A中;

  2. 遍历Node_B,判断其node.next是否存在于Set_A中,如果有则直接返回node.next,否则则遍历结束返回None。

Code:
class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        A = set()
        cur1 = headA
        cur2 = headB
        while cur1:
            A.add(cur1)
            cur1 = cur1.next
        while cur2:
            if cur2 in A:
                return cur2
            cur2 = cur2.next
        return None

方法二:

  1. 分别遍历两个链表,得到两个链表的长度差距;

  2. 让长的先做node.next,使得它们俩等长;

  3. 同时遍历两个链表,直到子链相同则停止遍历。

Code:
class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        cur1 = headA
        cur2 = headB
        n = 0
        # 1
        while cur1:
            n += 1
            cur1 = cur1.next
        while cur2:
            n -= 1
            cur2 = cur2.next
        if cur1 != cur2:
            return None
        cur1 = headA if n > 0 else headB
        cur2 = headB if cur1 == headA else headA
        n = abs(n)
        # 2
        while n:
            n -= 1
            cur1 = cur1.next
        # 3
        while cur1 != cur2:
            cur1 = cur1.next
            cur2 = cur2.next
        return cur1

        return None

方法三:

  1. 同时遍历两个链表;(假设长度分别为m,n,相交节点之后的长度为k)

  2. 当短的链表到达尾节点的时候n,开始遍历长链表m;

  3. 当长的链表到达尾节点的时候m,开始遍历短链表n;(此时两个链表的遍历长度将相同)

  4. 继续遍历,直到出现相同子链。(n+m-k与m+n-k处相交,k=0时则为null)

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        cur1 = headA
        cur2 = headB
        while cur1 != cur2:
            cur1 = cur1.next if cur1 else headB
            cur2 = cur2.next if cur2 else headA
        return cur1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值