這個題有幾種解法,一個是用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;
}
};