/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorderList(ListNode *head) {
if (head == nullptr) {
return;
}
ListNode *it_1 = head;
ListNode *it_2 = head;
ListNode *split_it = nullptr;
while (true) {
if (it_2 == nullptr) {
split_it = it_1->next;
it_1->next = nullptr;
break;
} else if (it_2->next == nullptr) {
split_it = it_1->next;
it_1->next = nullptr;
break;
}
it_1 = it_1->next;
it_2 = it_2->next->next;
}
if (split_it == nullptr) {
return;
}
ListNode *second_head;
for (ListNode *it_pre = split_it, *it_cur = split_it->next;;) {
if (it_cur == nullptr) {
second_head = it_pre;
break;
}
ListNode *it_post = it_cur->next;
it_cur->next = it_pre;
it_pre = it_cur;
it_cur = it_post;
}
split_it->next = nullptr;
for (ListNode *fst_it = head, *sec_it = second_head;;) {
if (sec_it == nullptr) {
break;
}
ListNode *fst_post_it = fst_it->next;
ListNode *sec_post_it = sec_it->next;
sec_it->next = fst_post_it;
fst_it->next = sec_it;
fst_it = fst_post_it;
sec_it = sec_post_it;
}
}
};
遍历找出中间节点,将链表一分为二,再将第二条链表反转,再按顺序合并两条链表。满足空间及时间复杂度要求。



京公网安备 11010502036488号