题解分为三个主要部分:1. 使用快慢指针找到链表的中间节点,从而将链表分为前半部和后半部。2. 反转链表的后半部分。3. 将反转后的后半部分交替插入前半部分中,从而达到题目要求的重排。快慢指针技巧用于高效找到链表中点,链表反转则是常规操作,最后的合并需要细心操作节点指针以避免丢失或混乱。
时间复杂度: O(n)
空间复杂度: O(1)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reorderList(self, head: ListNode) -> None:
"""
Do not return anything, modify head in-place instead.
"""
def reverList(head):
pre, cur = None, head
while cur:
tmp = cur.next
cur.next = pre
pre = cur
cur = tmp
return pre
pre = ListNode()
pre.next = head
slow = fast = pre
while fast and fast.next:
slow = slow.next
fast = fast.next.next
half = slow.next
slow.next = None
revHalf = reverList(half)
cur = pre.next
while cur and revHalf:
tmp = cur.next
cur.next = revHalf
cur = cur.next
revHalf = revHalf.next
cur.next = tmp
cur = cur.next
# 列表被改变到指定的重新排序状态