双指针:牛客-剑指offer系列题解--两个链表的第一个公共结点

记录刷题的过程。牛客和力扣中都有相关题目,这里以牛客的题目描述为主。该系列默认采用python语言。

1、问题描述:
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)

2、数据结构:
链表

3、题解:
双指针法:先找出一个链表1比链表2多出的K值,然后让链表1多走K,再循环比较大小

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def FindFirstCommonNode(self, pHead1, pHead2):
        # write code here
        def equalpoint(firstpoint,secondpoint,pHead1,pHead2):#注意函数参数的正确使用
            #找出链表长度之间的差值
            k = 0
            while secondpoint:
                secondpoint = secondpoint.next
                k += 1
            #先让长的那个走K步
            firstpoint = pHead1
            secondpoint = pHead2
            for i in range(k):
                secondpoint = secondpoint.next
            while firstpoint != secondpoint:
                firstpoint = firstpoint.next
                secondpoint = secondpoint.next
            return firstpoint
        firstpoint = pHead1
        secondpoint = pHead2
        while firstpoint and secondpoint:
            if firstpoint == secondpoint:
                return firstpoint
            firstpoint = firstpoint.next
            secondpoint = secondpoint.next        
        if secondpoint:
            equalpoint(firstpoint,secondpoint,pHead1,pHead2)
        if firstpoint:
            equalpoint(secondpoint,firstpoint,pHead2,pHead1)

简化版:

思路:
定义两个指针:node1,node2,分别指向两个链表的头结点headA,headB,然后指针移动
当任意指针走到各自的末尾时,就让它在从另一个链表的头部进行移动。
当他们相遇时,该结点就是第一个公共结点
class Solution:
    def FindFirstCommonNode(self, pHead1, pHead2):
        node1, node2 = pHead1, pHead2

        while node1 != node2:
            node1 = node1.next if node1 else pHead2
            node2 = node2.next if node2 else pHead1

        return node1

4、复杂度分析:
时间复杂度:O(N)
空间复杂度:O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值