题目难度: 中等
原题链接
今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复
剑指offer2
就能看到该系列当前连载的所有文章了, 记得关注哦~
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln-1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
class Solution:
def reorderList(self, head: ListNode) -> None:
"""
Do not return anything, modify head in-place instead.
"""
# 快慢指针找中点+右半部分翻转+链表合并
if not head:
return None
# 第一步: 快慢指针找中点
# 注意长度是偶数的话中点使用左半部分最后一个节点
fast = head.next
slow = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# 第二步: 右半部分翻转
# 此时slow是左半部分的尾节点
# 先断开左右部分的连接
cur = slow.next
slow.next = None
# 然后进行经典链表翻转
pre = None
while cur:
nex = cur.next
cur.next = pre
pre, cur = cur, nex
# 第三步: 链表合并
# 此时pre是右半部分翻转后的头节点
# 使用双指针依次指向对方下一个节点即可
l, r = head, pre
while l and r:
nl = l.next
nr = r.next
l.next = r
r.next = nl
l = nl
r = nr
return head
大家可以在下面这些地方找到我~
我的 GitHub
我的 Leetcode
我的 CSDN
我的知乎专栏
我的头条号
我的牛客网博客
我的公众号: 算法精选, 欢迎大家扫码关注~