剑指Offer52-两个链表的第一个公共节点

剑指Offer典型题整理 - 争取做最好的题解
整理时间:2020年02月21日
本题和 LeetCode 160题相同

1 题目描述

输入两个链表,找出它们的第一个公共节点。

注意

如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。

2 题解

链表题最适合画图分析了~

2.1 快慢指针1

这是我第一个想到的做法:首先遍历两个链表得到长度l1和l2,然后让较长的链表先往后移动abs(l1-l2)个位置,最后两个指针一直往后移动直至两个指针相等。比较简单,直接用python实现吧。

python代码

class Solution(object):
    def getIntersectionNode(self, headA, headB):
        len1, len2 = 0, 0
        # 计算链表1的长度
        head = headA
        while head:
            len1 += 1
            head = head.next
        # 计算链表2的长度
        head = headB
        while head:
            len2 += 1
            head = head.next
        
        # 将长的链表先移动
        while len1 - len2 > 0:
            headA = headA.next
            len1 -= 1
        while len2 - len1 > 0:
            headB = headB.next
            len2 -= 1

        while headA != headB:
            headA = headA.next
            headB = headB.next
        
        return headA
2.2 快慢指针2

这是一种更高明的解法,而且代码短小精悍!主要思路:让两个链表分别从head开始往后移动,如果链表1的指针到达尾部则将其重新定位到链表2的头部;对于链表2的指针进行同样的处理。这样一来,如果链表1和链表2存在交点,这两个指针在同时到达交点的时候移动的步数是一样的;如果链表1和链表2没有交点,两个指针会在将两个链表各遍历一遍之后停止在两个链表的末尾,此时ptr1 == ptr2 == None。

这里借用一下题解中的配图

在这里插入图片描述
python代码

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

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

(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值