Description
https://oj.leetcode.com/problems/reorder-list/
Difficulty: 2.0/5.0
Solution
We can solve this problem in three steps.
- First, locate the head of the second half
- Second, reverse the second list
- Third, Merge the two lists
class Solution {
public:
void reorderList(ListNode *head) {
//count the number of nodes
int nNode = 0;
ListNode * pt = head;
while(pt){
pt = pt->next;
nNode ++;
}
if (nNode < 3)
return;
// get the head of the second half
ListNode * ptCur = head;
for (int i = 0; i < (nNode-1)/2; ++ i)
ptCur = ptCur->next;
pt = ptCur->next;
ptCur->next = NULL;
//reserve the second half and combine the two lists
pt = reverse_list(pt);
head = combine_list(head, pt);
}
ListNode * reverse_list(ListNode *pt){
ListNode * ptCur = pt, * ptNext = pt->next;
ptCur->next = NULL;
while(ptNext){
pt = ptNext->next;
ptNext->next = ptCur;
ptCur = ptNext;
ptNext = pt;
}
return ptCur;
}
ListNode * combine_list(ListNode * l1, ListNode * l2){
ListNode* head = l1;
while(l1&&l2){
ListNode* tp1 = l1->next, * tp2 = l2->next;
l1->next = l2;
l2->next = tp1;
l1 = tp1, l2 = tp2;
}
return head;
}
};