[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;    }};

原创粉丝点击