给定一个单链表 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]
链表中点+反转链表+合并链表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
class Solution { public: void reorderList(ListNode* head) { if (head == nullptr){ return; } ListNode* mid = midNode(head); ListNode* l1 = head; ListNode* l2 = mid->next; mid->next = nullptr; l2 = reverseList(l2); mergeList(l1, l2); }
ListNode* midNode(ListNode* head) { ListNode* slow = head; ListNode* fast = head; while (fast->next != nullptr && fast->next->next != nullptr){ slow = slow->next; fast = fast->next->next; } return slow; }
ListNode* reverseList(ListNode* head) { ListNode* prev = nullptr; ListNode* p = head; ListNode* q = head; while (p != nullptr){ q = p->next; p->next = prev; prev = p; p = q; } return prev; }
void mergeList(ListNode* l1, ListNode* l2){ ListNode* l1_tmp; ListNode* l2_tmp; while (l1 != nullptr && l2 != nullptr){ l1_tmp = l1->next; l2_tmp = l2->next;
l1->next = l2; l1 = l1_tmp;
l2->next = l1; l2 = l2_tmp; } }
};
|