j

jaryue

V1

2023/05/21阅读:7主题:默认主题

876. 链表的中间结点

leetcode


题目描述

  1. 链表的中间结点 给你单链表的头结点 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

双指针:

定义两个指针,一个指向尾节点,一个指向中间节点,

循环遍历列表,尾节点一次移动两个位置,中间节点一次移动一个位置,中间就节点就是头节点到位节点的中间位置

直到尾节点为空时,返回中间节点的数值就是需要的答案

  • 时间复杂度(O(n))
  • 空间复杂度(O(1))

执行结果

法1

我们使用两个指针slow和fast,初始时都指向链表的头结点head。

快指针fast每次移动两个节点,慢指针slow每次移动一个节点。

当快指针fast到达链表的尾部时,慢指针slow就会指向链表的中间节点。

func middleNode(head *ListNode) *ListNode {
 if head == nil || head.Next == nil {
  return head
 }

 slow := head
 fast := head

 for fast != nil && fast.Next != nil {
  slow = slow.Next
  fast = fast.Next.Next
 }

 return slow
}

执行结果: 通过 显示详情 查看示例代码 添加备注

执行用时: 0 ms , 在所有 Go 提交中击败了 100.00% 的用户 内存消耗: 1.9 MB , 在所有 Go 提交中击败了 90.25% 的用户 通过测试用例: 36 / 36 炫耀一下:



分类:

后端

标签:

后端

作者介绍

j
jaryue
V1