解題思路
可以把步驟拆分為三大項:
1. 把 list 分為左右半,用 slow-fast pointer 即可求得
2. 把右半 list 給 reverse,這題同樣寫過
3. 兩個 list merge,這題同樣也寫過
程式碼
class Solution {
public:
void reorderList(ListNode* head) {
// find the mid point and split the list to two
ListNode *slow = head, *fast = head;
while(fast != nullptr && fast->next != nullptr)
{
slow = slow->next;
fast = fast->next->next;
}
// reverse the second part of the list
ListNode* prev = nullptr, *second = slow->next;
ListNode* next;
slow->next = nullptr;
while(second != nullptr)
{
next = second->next;
second->next = prev;
prev = second;
second = next;
}
// merge two list
ListNode *firstHead = head, *secondHead = prev, *next1, *next2;
while(secondHead != nullptr)
{
next1 = firstHead->next;
next2 = secondHead->next;
firstHead->next = secondHead;
secondHead->next = next1;
firstHead = next1;
secondHead = next2;
}
}
};
沒有留言:
張貼留言