【LeetCode 】876. 链表的中间结点(快慢 双指针法 追及问题系列)

1. 题目描述

给定一个带有头结点 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])
由于该列表有两个中间结点,值分别为 34,我们返回第二个结点。

提示:

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

2. 解题思路

可以采用快慢指针,slow 指针每步走 1 个节点,fast 指针每步走 2 个节点。那么当 fast 走到尾节点的时候,slow 一定刚好走到中间节点。(偶数节点个数的情况下,slow刚好走到中间 2 个节点的 后一个节点上,所以可以直接返回答案)。

每错,这又是利用快慢指针思想。和其他几题是一种套路!!!本题其实是 No. 234 回文链表 的子题。具体可参见以前的文章。

【LeetCode】141 环形链表 I,142. 环形链表 II(双指针 中学追及问题)

【LeetCode 】160. 相交链表(双指针法 Python 7行代码 中学追及问题)

【LeetCode 】234. 回文链表(史上最详细 图文并茂 双指针法)

3. Python 代码

# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None

class Solution:
    def middleNode(self, head: ListNode) -> ListNode:
        if (head.next is None):
            return head
        
        slow = head
        fast = head
        while(fast and fast.next):
            slow = slow.next
            fast = fast.next.next

        return slow

参考

【LeetCode】141 环形链表 I,142. 环形链表 II(双指针 中学追及问题)

【LeetCode 】160. 相交链表(双指针法 Python 7行代码 中学追及问题)

【LeetCode 】234. 回文链表(史上最详细 图文并茂 双指针法)

全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务