【LeetCode 热题 100】160. 相交链表 | python【简单】0

边练习边更新,加油!!!

题目:

160. 相交链表

给你两个单链表的头节点 headAheadB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null

图示两个链表在节点 c1 开始相交

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构

注意点:

  1. 用集合储存,减少遍历时间和判断时间(集合里的元素只能唯一,在这里不影响)
  2. 将b指针直接代入集合搜索,减少储存
  3. c++的null是python的None
  4. 进阶:设计一个时间复杂度 O(m + n) 、仅用 O(1) 内存的解决方案

标准做法:

双指针:相交长度c,不相交长度a/b

相交:走a+c+b会指向同一个

不相交:走a+c+b+c会指向None

注意:链表长度为0的情况

# 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
    ) -> Optional[ListNode]:
        cur1, cur2 = headA, headB
        while cur1 or cur2:
            if cur1 == cur2:
                return cur1
            cur1 = cur1.next if cur1 else headB
            cur2 = cur2.next if cur2 else headA
        return

作者:RainForest
链接:https://leetcode.cn/problems/intersection-of-two-linked-lists/solutions/3593376/dui-cheng-shou-wei-lian-jie-by-gcsyymm-u2kp/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

奇怪的做法:

来自评论区:A走一遍把值取str,B走一遍发现第一个字符串就是相交点,最后再把A的值改回来

自己的做法:【看题解后仍未通过时间】

看了一下题解,搜索b链表的结点在a集合里是否存在,当a存储为列表时,超时

# 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
        """
        end = headA
        lA = {headA}
        while end:
            end = end.next
            lA.add(end)
        
        while headB:
            if headB in lA:   # 不存B直接判断
                break
            else:
                headB = headB.next


        return headB
        

1.超时:储存两个链表(也不要想得太简单和理所当然吧)

时间复杂度n2

# 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
        """
        end = headA
        lA = [headA]
        while end:
            end = end.next
            lA.append(end)
        end = headB
        lB = [headB]
        while end:
            end = end.next
            lB.append(end)
        for node in lA:
            if node in lB:
                break
            if node == None:
                return null

        return node
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值