给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
给定链表 1->2->3->4, 重新排列为 1->4->2->3.
示例 2:
给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.
解法一:
反转后半部分,然后交替合并。
使用快慢指针找到链表的中间节点。当链表长度为偶数时,慢指针停留在后半段的头,两段等长;当链表长度为奇数时,慢指针停留在正中间的节点,后半段的长度比前半段多1,不影响交替合并。
class Solution:def reorderList(self, head: ListNode) -> None:if not head:return# 找到中点slow, fast = head, headwhile fast.next and fast.next.next:slow = slow.nextfast = fast.next.next# 翻转后半pre, cur = None, slow.nextslow.next = Nonewhile cur:nxt = cur.nextcur.next = prepre, cur = cur, nxt# 交替合并p, q = head, prewhile p and q:pn, p.next = p.next, qp, q = q, pn
