Reorder List

来源:互联网 发布:centos syslog 配置 编辑:程序博客网 时间:2024/04/29 09:08

Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-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}.


L : L0→L1→…→Ln-1→Ln 分成两个链表
L1:L0→L2→…→Ln/2
L2 : Ln/2+1…→Ln 再将 L2翻转 L2:Ln…→Ln/2+1
然后再合并两个表。

class Solution {public:    ListNode* reverselist ( ListNode* head  ) {        ListNode* p = head, *q = head->next, *r = NULL;        while ( q != NULL ) {            r = q->next;            q->next = p;            p = q;            q = r;        }        head->next = NULL;        return ( head = p );    }    ListNode* getmid ( ListNode* head, bool sblit = true ) {        if ( head == NULL || head->next == NULL || head->next->next == NULL ) {            return head;        }        ListNode* p = head, *q = head, *r = NULL;        while ( q != NULL && q->next != NULL ) {            r = p;            p = p->next;            q = q->next->next;        }        if ( sblit == true ) {            r->next = NULL;        }        return p;    }    ListNode* connectlist ( ListNode* p, ListNode* q ) {        if ( p == NULL ) {            return q;        }else if ( q == NULL ) {            return p;        /* both p and q are all not NULL */        bool flag = true;   // 使用flag来轮转        ListNode* r = p, *head = p;        while ( p != NULL && q != NULL ) {            if ( flag ) {                p = p->next;                head->next = q;                flag = false;            } else {                q = q->next;                head->next = p;                flag = true;            }            head = head->next;        }        //head->next = ( p != NULL ? p : q );        return r;    }    void reorderList ( ListNode *head ) {        /* 指针为NULL,或者只有一个元素,或者只有两个元素,不做任何处理 */        if ( head == NULL || head->next == NULL || head->next->next == NULL ) {            return ;        }                ListNode* mid = getmid ( head );        mid = reverselist ( mid );        head = connectlist ( head, mid );    }};
0 0