Leetcode刷题记录——面试题 02.07. 链表相交

在这里插入图片描述

此题很无语,因为这道寻找交叉节点的题

1、不能用反转链表来做,否则当你反转了第一个链表的时候,如果第二个链表和第一个链表有交叉,第二个链表的尾部也乱了

2、寻找的是相同的引用,就是看上面的示例1,虽然两个链表的尾部都是 1 8 4 5,但是第一个1不是交叉节点,8才是,这需要我们在每次判断是否为交叉节点时,不能比较值是否相等,而是比较引用是否相等

思路:如果两个链表有交叉,那么交叉点一定在更短一些的链表中
于是我们先获取2个链表的长度,并将两个链表尾部对齐,
然后舍弃较长的链表中前部多出来的部分
此后,我们对两个链表中每个元素进行遍历
当找到相等的引用时 返回之

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

class Solution:
    def __init__(self):
        self.new1 = None
        self.new2 = None
    
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        len1 = 0
        len2 = 0
        cur1 = headA
        cur2 = headB
        while cur1 is not None:
            len1 += 1
            cur1 = cur1.next
        while cur2 is not None:
            len2 += 1
            cur2 = cur2.next
        if len1 != len2:
            todo = headA if len1 > len2 else headB
            wait = headB if len1 > len2 else headA
            for i in range(abs(len1 - len2)):
                todo = todo.next
        else:
            todo = headB
            wait = headA
        res = None
        while todo is not None:
            if todo == wait:
                return todo
            todo = todo.next
            wait = wait.next
        return None

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值