【leetcode】链表的中间结点

朴素方法:速度也很快啊

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
        # Solution 1: 朴素方法
        
        # 遍历链表得到链表的长度
        n = 0
        p = head
        while p:
            n += 1
            p = p.next
        # 链表长度是偶数或者奇数,找到中间节点,都是移动n//2次
        q = head
        for i in range(0, n//2):
            q = q.next
        
        
        # 此时q是中间节点
        return q

快慢指针:速度提升了嘛?

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
        
        # Solution 2: 快慢指针
        slow, fast = head, head
        # 指针移动的条件是,当前快指针和当前快指针的下一个结点都非空
        while fast and fast.next:
            slow = slow.next # 慢指针走1步
            fast = fast.next.next # 快指针走2步
        # 此时无论链表长度是奇数还是偶数,slow都是符合题目要求的中间节点
        return slow

猜你喜欢

转载自blog.csdn.net/ningmengzhihe/article/details/127827378