首先用快慢指针找中点,注意这里找的实际是中点前一个,然后反转,在归并。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
void reorderList(ListNode* head) {
if(head == nullptr){
return;
}
ListNode* mid = middleNode(head);
ListNode* l1 = head;
ListNode* l2 = mid->next;
mid->next = nullptr;
l2 = reverseList(l2);
mergeList(l1, l2);
}
void PrintList(ListNode* p){
while(p!=nullptr){
cout << p->val << " ";
p = p->next;
}
cout<<endl;
}
void mergeList(ListNode* l1, ListNode* l2){
ListNode* p1 = l1;
ListNode* p2 = l2;
while(p1 != nullptr && p2 != nullptr){
ListNode* p1_next = p1->next;
ListNode* p2_next = p2->next;
p1->next = p2;
p2->next = p1_next;
p1 = p1_next;
p2 = p2_next;
}
}
ListNode* middleNode(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* pre = NULL;
ListNode* cur = head;
while(cur!=NULL){
ListNode* next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
return pre;
}
};