[LeetCode]Reorder List
来源:互联网 发布:数字三角形问题 算法 编辑:程序博客网 时间:2024/05/16 10:14
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: void reorderList(ListNode *head) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. if(head == NULL) return; int listLen = getListLen(head); ListNode* head1 = NULL; ListNode* head2 = NULL; divideList(head, listLen, head1, head2); head2 = reverseList(head2); mergeList(head1, head2); }private: void divideList(ListNode* head, int listLen, ListNode*& head1, ListNode*& head2) { int firstHalfLen = (listLen+1)/2; head1 = head; ListNode* pFirstHalf = head; for(int k = 1; k < firstHalfLen; ++k) pFirstHalf = pFirstHalf->next; head2 = pFirstHalf->next; pFirstHalf->next = NULL; } ListNode* reverseList(ListNode* head) { if(head == NULL) return head; ListNode dummy(-1); ListNode* prev = &dummy; prev->next = head; ListNode* reverseHead = head; ListNode* reverseTail = head; ListNode* cur = head->next; while(cur) { reverseTail->next = cur->next; prev->next = cur; cur->next = reverseHead; reverseHead = cur; cur = reverseTail->next; } return dummy.next; } void mergeList(ListNode* head1, ListNode* head2) { ListNode dummy(-1); ListNode* prev = &dummy; while(head1 || head2) { prev->next = head1; head1 = head1->next; prev = prev->next; prev->next = head2; if(head2) { head2 = head2->next; prev = prev->next; } } } int getListLen(ListNode* head) { int len = 0; while(head) { len++; head = head->next; } return len; }};