这个题有几种解法,一个是用vector 存储,O(n)空间复杂度,一个是直接在链表上操作,O(1)空间复杂度,但是操作复杂,涉及到链表中点查找,revserse 以及链表的merge,这样一个题就复习了三个解法。
下面是O(1)的解法。
class Solution {
public:
ListNode* reverseList(ListNode* head){
ListNode* tmp = new ListNode(0);
ListNode* p1 = head;
if(head == NULL) return head;
ListNode* p2 = p1->next;
p1->next = NULL;
while(p1 != NULL && p2 != NULL){
tmp = p2->next;
p2->next = p1;
p1= p2;
p2 = tmp;
}
return p1;
}
void reorderList(ListNode* head) {
if(head == NULL) return;
ListNode* fast = head;
ListNode* slow = head;
ListNode* tmp = head;
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
while(slow != NULL && fast != NULL && fast->next != NULL){
fast = fast->next->next;
slow = slow->next;
}
ListNode* newHead = slow->next;
slow->next = NULL;
newHead = reverseList(newHead);
while(head != NULL && newHead != NULL){
tmp = head->next;
head->next = newHead;
head = tmp;
tmp = newHead->next;
newHead->next = head;
newHead = tmp;
}
head = dummyHead->next;
}
};