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

news/2024/12/20 20:31:47/

题目

给你单链表的头结点 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的字典

我的代码

python"># 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 = headn = 1while cur:dic[n] = curcur = cur.nextn += 1print(n)return dic[(n+1)//2]  

题解思路——双指针

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

参考代码

python"># 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 headfast = low = headwhile fast and fast.next:fast = fast.next.nextlow = low.nextreturn 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.ppmy.cn/news/1556726.html

相关文章

LeetCode 刷题笔记

LeetCode 刷题笔记 1. 20241218 &#xff08;1&#xff09;2447 std::gcd是C17引入的一个函数&#xff0c;用于计算两个整数的最大公因数。位于<numeric>头文件中。 #include <iostream> #include <numeric> // std::gcdint main() {int a 36;int b 60…

BlueLM:以2.6万亿token铸就7B参数超大规模语言模型

一、介绍 BlueLM 是由 vivo AI 全球研究院自主研发的大规模预训练语言模型&#xff0c;本次发布包含 7B 基础 (base) 模型和 7B 对话 (chat) 模型&#xff0c;同时我们开源了支持 32K 的长文本基础 (base) 模型和对话 (chat) 模型。 更大量的优质数据 &#xff1a;高质量语料…

使用Python进行excel的数据简单分析

Python代码&#xff0c;需要将处理后分析得到的数据存储到与当前目录下的一个Excel文件中去。 完整的Python代码&#xff08;初&#xff09;&#xff1a; import pandas as pd import os# 读取Excel文件 file_path 供应链分析.xlsx excel_data pd.ExcelFile(file_path)# 读取…

【Linux】常用命令大全

【Linux】命令大全 【一】文件【1】文件基本属性&#xff08;1&#xff09;ll或者ls –l查看文件的属性以及文件所属的用户和组 【2】文件属主和属组【3】更改文件属性&#xff08;1&#xff09;chgrp&#xff1a;更改文件属组&#xff08;2&#xff09;chown&#xff1a;更改文…

12.7深度学习_经典神经网络_VGG

一、VGG神经网络 ​ VGG的亮点在于它通过堆叠多个卷积层&#xff0c;以小的卷积核和池化层的方式来增加网络深度&#xff0c;从而实现高精度的图像识别。这种方法可以有效地捕获图像中的高级特征&#xff0c;并通过不断拟合训练数据来提高识别准确率。 1. 小卷积作用 ​ DC …

单步调试Android Framework——App冷启动

纸上得来终觉浅&#xff0c;绝知此事要躬行。 —— [宋]陆游 基于aosp_cf_x86_64_phone-trunk_staging-eng &#xff0c; 下面是具体断点位置。 第一部分&#xff0c;桌面launcher进程 com.android.launcher3.touch.ItemClickHandler onClickonClickAppShortcutstartAppShor…

数据结构----链表头插中插尾插

一、链表的基本概念 链表是一种线性数据结构&#xff0c;它由一系列节点组成。每个节点包含两个主要部分&#xff1a; 数据域&#xff1a;用于存储数据元素&#xff0c;可以是任何类型的数据&#xff0c;如整数、字符、结构体等。指针域&#xff1a;用于存储下一个节点&#…

ilqr算法原理以及常见自动驾驶轨迹优化问题建模

1. ilqr ILQR算法是基于nominal trajectory ( x ~ , u ~ ) (\tilde{x}, \tilde{u}) (x~,u~)来优化求解的。ILQR是求解状态变量和控制变量的增量序列 ( δ x ∗ , δ u ∗ ) (\delta x^*, \delta u^*) (δx∗,δu∗)求解轨迹的局部最优值。 1.1 无约束轨迹优化问题形式 x ∗ ,…