俩个单链表第一个公共节点

如题,题目要求找寻俩个单链表的第一个公共节点,如果有公共节点,则返回这个公共节点,否则返回None
首先,分析问题,单链表如果有公共节点,即肯定是这样的
在这里插入图片描述
常规做法:首先看哪个链表长,长链表先走(他们的差)步,然后再一起遍历,有公共节点则返回,没有返回None,但是这种太麻烦了,你还得分别遍历俩个链表,分别求其长度,求到长度以后,然后再开始遍历。有兴趣的写一下吧。
今天要介绍的这种方法,很简洁。
新方法:直接遍历,就是我判断终止的条件是俩个节点相同,链表1和链表2分别开始遍历,链表1如果遍历到尾,让它指向链表2的头。同理,链表2如果遍历到了尾,让它指向链表1的头。。。那这样的话,长度相同有公共结点,第一次就遍历到;没有公共结点,走到尾部NULL相遇,返回NULL,长度不同有公共结点,第一遍差值就遍历出来了,所以第二遍一定会一起到公共结点;没有公共,一起到结尾NULL
下面展示代码

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
def FindFirstCommonNode(pHead1, pHead2):
    # write code here
    p1, p2 = pHead1, pHead2
    while p1 != p2:
        p1 = pHead2 if p1 == None else p1.next
        p2 = pHead1 if p2 == None else p2.next
    return p1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值