LeetCode 160.相交链表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Oscar6280868/article/details/88871335

这道题目是要找到两个链表相交的起始节点,题目如下所示:
链表相交
这里有一个很巧妙的解法,我们来从这两个链表的结构来分析,我们如何去找到两个链表相交的起始节点呢?相交之后的链表是一样的,我们看下图所示:
在这里插入图片描述
在图中 A A 点和 B B 点分别表示两个链表的起点, C C 点事我们要找的交点, A C AC 的长度是 a a B C BC 的长度是 b b ,剩下相同部分的内容长度是 c c ,那么我们可以用两个指针分别从 A A B B 出发,到链表结束的时候将指针指向另外一个链表的起始点,也就是说两个指针的运行轨迹分别是: A C D B C A \to C \to D \to B \to C B C D A C B \to C \to D \to A \to C ,每个指针所走的长度分别是: a + c + b a+c+b b + c + a b+c+a ,因为 a + c + b = b + c + a a+c+b=b+c+a ,所以说两个指针分别从 A A B B 两个点出发,到尾部指向另一个链表的头,最终两个指针会在C点相遇,这么一来我们就可以找到两个链表相交的地方,如下是代码:

# 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
        p = headA
        q = headB
        while p is not q:
            p = p.next if p else headB
            q = q.next if q else headA
        return p

我们用指针走的距离和相等的特性来作为找相交节点的突破口是一个比较巧妙的办法,希望对大家理解链表有所帮助,谢谢。

猜你喜欢

转载自blog.csdn.net/Oscar6280868/article/details/88871335
今日推荐