当前位置: 首页 > article >正文

[LeetCode-Python版] 876. 链表的中间结点

题目

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

在这里插入图片描述

输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 。

示例 2:
在这里插入图片描述

输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。

提示:

  • 链表的结点数范围是 [1, 100]
  • 1 <= Node.val <= 100

题目链接

我的思路

  1. 遍历链表,用一个代表序号的变量n和一个字典dic映射每个链表节点的顺序
  2. 返回dic[(n+1)//2]

思路不足

  • 空间复杂度是O(N),因为用了一个长度为N的字典

我的代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
        dic = {}
        cur = head
        n = 1
        while cur:
            dic[n] = cur
            cur = cur.next
            n += 1
        print(n)
        return dic[(n+1)//2]  

题解思路——双指针

  1. 定义一个快指针和一个慢指针,快指针每次走两步,慢指针走一步
  2. 当快指针为空时,慢指针即为中间节点

参考代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head or not head.next: return head
        fast = low = head
        while fast and fast.next:
            fast = fast.next.next
            low = low.next
        return low
        

Q&A

  1. 双指针解法中,为什么是while fast and fast.next :,如果只用while fast :while fast.next :会怎样?
    • 使用 while fast 作为循环条件意味着只要 fast 不是 None,循环就会继续。对于链表长度为奇数的情况,使用while fast会导致 low 超过中间节点。
      例如,有一链表1 -> 2 -> 3 -> 4 -> 5

      • 初始时,low 和 fast 都指向(1)
      • 第一次迭代后,low 指向(2),fast 指向(3)
      • 第二次迭代后,low 指向(3),fast 指向(5)
      • 此时 while fast 仍然为真,进行下一次迭代,low 将指向(4),fast将指向空,退出循环

      由此可见,当链表长度为奇数时,low 最终会指向中间节点的下一个节点,而不是中间节点。

    • 使用 while fast.next 作为循环条件意味着只要 fast.next 不是 None,循环就会继续。如果链表的长度是偶数,它引用一个空对象的属性,从而报错。
      例如,有一链表1 -> 2 -> 3 -> 4

      • 初始时,low 和 fast 都指向(1)
      • 第一次迭代后,low 指向(2),fast 指向(3)
      • 第二次迭代后,low 将指向(3),fast将指向空
      • 下一次循环时,fast是一个空对象,没有next属性,报错

      由此可见,当链表长度为偶数时,使用while fast.next 作为循环条件会报错AttributeError: 'NoneType' object has no attribute 'next'


http://www.kler.cn/a/442845.html

相关文章:

  • Python statistics 模块
  • Observability:将 OpenTelemetry 添加到你的 Flask 应用程序
  • 腾讯云AI代码助手编程挑战赛——贪吃蛇小游戏
  • IDEA的常用设置
  • Mysql常见知识点
  • Linux 内核中的 netif_start_queue 函数:启动网络接口发送队列的关键
  • 一键学懂BurpSuite(8)
  • 【Java入门指南 Day11:Lambda表达式与Stream API】
  • 8.2 分库分表简介
  • Java创建对象有几种方式?
  • 理解并使用 sysdig
  • ubuntu监测硬盘状态
  • 图像分割数据集石头rock分割数据集labelme格式2602张3类别
  • Leetcode 208实现Trie树前缀
  • iOS 核心动画
  • 【深入理解ApacheTomcat】
  • 数据结构和算法-06线段树-01
  • DOA估计算法——ESPRIT算法
  • mysql,创建数据库和用户授权核心语句
  • 使用 ts-node插件运行ts
  • C++的诗行:类与对象(中)
  • 关于IP代理API,我应该了解哪些功能特性?以及如何安全有效地使用它来隐藏我的网络位置?
  • 通过Canvas获得视频某一帧
  • Myabits的执行过程
  • Eureka控制中心:微服务控制的极速上手指南
  • WPF+MVVM案例实战与特效(四十一)-WPF文本到几何路径转换的艺术:轻松实现自定义字体路径生成