题目链接

143. 重排链表

题目描述

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

  1. L0 L1 Ln - 1 Ln

请将其重新排列后变为:

  1. L0 Ln L1 Ln - 1 L2 Ln - 2

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
image.png

  1. 输入:head = [1,2,3,4]
  2. 输出:[1,4,2,3]

示例 2:
image.png

  1. 输入:head = [1,2,3,4,5]
  2. 输出:[1,5,2,4,3]

解题思路

1. 中点 + 翻转 + 合并

  1. class Solution {
  2. public void reorderList(ListNode head) {
  3. // 1. 双指针找中点断链
  4. ListNode fast = head;
  5. ListNode slow = head;
  6. while (fast.next != null && fast.next.next != null) {
  7. fast = fast.next.next;
  8. slow = slow.next;
  9. }
  10. ListNode rHead = slow.next;
  11. slow.next = null;
  12. // 2. 翻转后半部分链表
  13. rHead = reverse(rHead);
  14. // 3. 前半部分链表与翻转后的链表合并
  15. while (rHead != null) {
  16. ListNode t1 = head.next;
  17. ListNode t2 = rHead.next;
  18. head.next = rHead;
  19. rHead.next = t1;
  20. head = t1;
  21. rHead = t2;
  22. }
  23. }
  24. public ListNode reverse(ListNode head) {
  25. ListNode pre = null;
  26. while (head != null) {
  27. ListNode temp = head.next;
  28. head.next = pre;
  29. pre = head;
  30. head = temp;
  31. }
  32. return pre;
  33. }
  34. }