leetcode 160. 相交链表

160. 相交链表
编写一个程序,找到两个单链表相交的起始节点。

如下面的两个链表:

在这里插入图片描述

在节点 c1 开始相交。

示例 1:

在这里插入图片描述

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。


这道题的思路有点像有环链表去找一个环的入口一样。
两个链表同时开始往后移,当一个链表移动到尾部时候,就换到另一个链表的表头开始移动。这样两者都会走一样长的路程,最后在输出相同的其实节点即可。

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

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        if not headB or not headA: return None
        piontA, piontB = headA, headB
        cnt = 0

        while piontB != piontA:
            piontB = piontB.next
            piontA = piontA.next
            if not piontA: #找到当前的链表尾部,换到另一个链表的表头
                piontA = headB
                cnt += 1

            if not piontB: #找到当前的链表尾部,换到另一个链表的表头
 				piontB = headA
                cnt += 1
                
            if cnt > 2:#只需要对接两次就可以了,如果两次之后还是没有相遇,那么肯定不会相遇
                return None
        return piontA

其实我这里考虑交换链表无线循环是没有必要的,因为链表的尾部都是接的None,那么肯定有一个None是相等的。

class Solution(object):
    def getIntersectionNode(self, headA, headB):
        ha, hb = headA, headB
        while ha != hb:
            ha = ha.next if ha else headB
            hb = hb.next if hb else headA
        return ha

作者:jyd
链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/solution/intersection-of-two-linked-lists-shuang-zhi-zhen-l/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值