LeetCode: Reorder List

来源:互联网 发布:翼龙贷 数据之家 编辑:程序博客网 时间:2024/05/23 19:15

Given a singly linked list LL0L1→…→Ln-1Ln,
reorder it to: L0LnL1Ln-1L2Ln-2→…

You must do this in-place without altering the nodes' values.

For example,

Given {1,2,3,4}, reorder it to {1,4,2,3}.

/** * 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) {        int count =0;        ListNode* half = head;        ListNode* itr = head;        while(itr)        {            count++;            itr = itr->next;        }        itr = head;        if(count == 0 || count == 1 || count == 2)            return;        for(int i = 0; i < count/2; i++)        {            itr = half;                        half = half->next;        }        itr->next = NULL;                ListNode* pre = NULL;        ListNode* cur = half;        while(cur)        {            ListNode* next = cur->next;            cur->next = pre;            pre = cur;            cur = next;        }        half = pre;        itr = head;        while(itr && half)        {            ListNode* h_next = itr->next;            ListNode* e_next = half->next;            if(h_next)                half->next = itr->next;            itr->next = half;            itr = h_next;            half = e_next;        }                    }};

Round 2:

class Solution {public:    void reorderList(ListNode *head) {        int size = 0;        ListNode *iter = head, *rhead = head, *pre = NULL, *next = NULL;        while(iter)        {            iter = iter->next;            size++;        }        int mid = 0;        iter = head;        while(mid < size/2)        {            if(mid == size/2-1)            {                rhead = iter->next;                iter->next = NULL;            }            iter = iter->next;            mid++;        }        while(rhead != NULL)        {            next = rhead->next;            rhead->next = pre;            pre = rhead;            rhead = next;        }        iter = head;        rhead = pre;        while(iter != NULL)        {            next = iter->next;            if(next == NULL)                next = rhead->next;            iter->next = rhead;            rhead = rhead->next;            iter->next->next = next;            iter = next;        }            }};


0 0
原创粉丝点击