「力扣」第 876 题:链表的中间结点(简单)


「力扣」第 876 题:链表的中间结点(简单)

给定一个带有头结点 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,我们返回第二个结点。

提示:

给定链表的结点数介于 1 和 100 之间。

方法:快慢指针(Python 代码、Java 代码)

使用快慢指针是求单链表中间结点,以及 倒数第 k 个结点 的常用方法。

题目要求:如果有两个中间结点,则返回第二个中间结点。此时快指针可以前进的条件是:当前快指针和当前快指针的下一个结点都非空。

  • 如果题目要求:如果有两个中间结点,则返回第一个中间结点,此时快指针可以前进的条件是:当前快指针的下一个结点和当前快指针的下下一个结点都非空。

注意体会以上二者的不同之处,其实画一个图就很清楚了。

876-1.png
876-2.png

参考代码

Java 代码:

class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }
}

public class Solution {

    public ListNode middleNode(ListNode head) {
        if (head == null) {
            return null;
        }
        ListNode slow = head;
        ListNode fast = head;

        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }
}

Python 代码:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def middleNode(self, head: ListNode) -> ListNode:
        if head is None:
            return None

        slow = head
        fast = head

        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
        return slow

文章作者: liweiwei1419
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liweiwei1419 !
评论
 上一篇
「栈」专题 1:栈的使用 「栈」专题 1:栈的使用
「栈」专题 1:栈的使用这一部分,我们开始介绍「栈、队列、优先队列」。栈和队列虽然是简单的数据结构,但是使用这些简单的数据结构所解决的算法问题不一定简单。在这一章里,我们将来探索,和栈与队列相关的算法问题。 栈和队列的使用,栈和队列是两种基
2017-09-01
下一篇 
「力扣」第 460 题:LFU 缓存 「力扣」第 460 题:LFU 缓存
「力扣」第 460 题:LFU 缓存 链接 题解链接 设计并实现最不经常使用(LFU)缓存的数据结构。它应该支持以下操作:get 和 put。 get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1。put(
  目录