给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4]
输出:[1,4,2,3]
示例 2:
输入:head = [1,2,3,4,5]
输出:[1,5,2,4,3]
思路:
先将链表拆分成前后两半 A 和 B。后一半 B 逆转成 C。再将 A 和 C 交叉合并。
例如:1->2->3->4->5 拆分成:A=1->2->3,B=4->5。
然后把 B 逆转 成 C=5->4。最后 A 和 C 交叉合并成 D=1->5->2->4->3。
# 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.
"""
if head == None or head.next == None:
return
# 1. 找到链表的中点
fast = head
slow = head
while fast.next and fast.next.next:
fast = fast.next.next
slow = slow.next
mid = slow
# 2. 后半段指针反转
r_head = mid.next
mid.next = None
cur = r_head
pre = None
while cur:
nxt = cur.next
cur.next = pre
pre = cur
cur = nxt
reverse_r_head = pre
# 3. 后半段插入到前半段
l = head
r = reverse_r_head
while r:
l_nxt = l.next
r_nxt = r.next
r.next = l.next
l.next = r
l = l_nxt
r = r_nxt
return head
25. Leetcode 143. 重排链表 (链表-基础操作类-重排链表)
于 2022-01-27 10:18:22 首次发布