写点什么

【LeetCode】链表的中间结点 Java 题解

作者:HQ数字卡
  • 2022 年 5 月 18 日
  • 本文字数:841 字

    阅读完需:约 3 分钟

题目描述

给定一个头结点为 head 的非空单链表,返回链表的中间结点。


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



示例 1:
输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
示例 2:
输入:[1,2,3,4,5,6]输出:此列表中的结点 4 (序列化形式:[4,5,6])由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。
来源:力扣(LeetCode)链接:https://leetcode.cn/problems/middle-of-the-linked-list著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码

思路分析

  • 今天的算法题目是链表题目,题目要求返回链表的中间节点。我们都知道链表是不连续的空间,不能直接按照索引遍历。如果是向数组一样的结构,就可以直接通过下标直接获取到中间位置。根据上面的思路,我们可以首先遍历上面的链表,转换成数组的存储,就可以直接返回中间节点。

  • 还有一种思路是采用快慢指针,慢指针一次只走一步,快指针一次走两步。当快指针到达终点的时候,慢指针的位置即使是中间节点。实现代码如下,供参考。

通过代码

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode() {} *     ListNode(int val) { this.val = val; } *     ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */class Solution {    public ListNode middleNode(ListNode head) {        ListNode slow = head, fast = head;        while (fast != null && fast.next != null) {            slow = slow.next;            fast = fast.next.next;        }        return slow;    }}
复制代码

总结

  • 上述算法的时间复杂度是 O(n), 空间复杂度是 O(n)

  • 坚持算法每日一题,加油!

发布于: 刚刚阅读数: 3
用户头像

HQ数字卡

关注

还未添加个人签名 2019.09.29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】链表的中间结点Java题解_LeetCode_HQ数字卡_InfoQ写作社区