给定一个单链表 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,不影响交替合并。

  1. class Solution:
  2. def reorderList(self, head: ListNode) -> None:
  3. if not head:
  4. return
  5. # 找到中点
  6. slow, fast = head, head
  7. while fast.next and fast.next.next:
  8. slow = slow.next
  9. fast = fast.next.next
  10. # 翻转后半
  11. pre, cur = None, slow.next
  12. slow.next = None
  13. while cur:
  14. nxt = cur.next
  15. cur.next = pre
  16. pre, cur = cur, nxt
  17. # 交替合并
  18. p, q = head, pre
  19. while p and q:
  20. pn, p.next = p.next, q
  21. p, q = q, pn