美文网首页
双指针 4 (链表的中间结点 leetcode 876)

双指针 4 (链表的中间结点 leetcode 876)

作者: Sisyphus235 | 来源:发表于2023-01-30 21:51 被阅读0次

思想

双指针算法不仅应用于链表,在数组等数据结构中也有广泛应用。
核心思路是指向问题中的关键节点,根据问题的上下文逻辑变换位置,最终解决问题。

实例

链表的中间结点 leetcode 876

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

输入:
head: ListNode,一个链表

输出:
ListNode,返回链表的中间节点。

举例:
当 head = [1,2,3,4,5] 时,返回中间节点 3,后面的链表中要有 4 和 5 两个节点。

关键点

核心是表达中间节点,这里的关键点是使用两个指针,快的一次走 2 个节点,慢的一次走 1 个节点,这样当快的到达尾端的时候,慢的到达链表的中点。
解题时要注意奇偶的边界条件:
(1)奇数
head = [1,2,3]
初始,slow = fast = dummy;
第 1 步,fast = 2,slow = 1;
第 2 步,fast = None,slow = 2;
(2)偶数
head = [1,2]
初始,slow = fast = dummy;
第 1 步,fast = 2,slow = 1;
第 2 步,fast = None,slow = 2;
(3)边界
head = [1]
初始,slow = fast = dummy;
第 1 步,fast = None,slow = 1;

编码

from typing import Optional


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


def middle_of_the_linked_list(head: Optional[ListNode]) -> Optional[ListNode]:
    # 准备双指针
    dummy = ListNode(next=head)
    slow = fast = dummy
    # 按照 2 和 1 的步速遍历
    while fast is not None:
        slow = slow.next
        # fast 一般走 2 步,如果第一步到达末尾则走 1 步
        fast = fast.next if fast.next is None else fast.next.next
    return slow

相关

双指针 0
双指针 1
双指针 2
双指针 3

相关文章

网友评论

      本文标题:双指针 4 (链表的中间结点 leetcode 876)

      本文链接:https://www.haomeiwen.com/subject/qfkvhdtx.html