lintcode:Reorder List

来源:互联网 发布:黑客用函数语言编程 编辑:程序博客网 时间:2024/06/03 03:12

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->null, reorder it to 1->4->2->3->null.

/** * Definition of ListNode * class ListNode { * public: *     int val; *     ListNode *next; *     ListNode(int val) { *         this->val = val; *         this->next = NULL; *     } * } */class Solution {public:    /**     * @param head: The first node of linked list.     * @return: void     */    void reorderList(ListNode *head) {        // write your code here        //为空和一个值的情况        if(head==NULL||head->next==NULL){            return;        }        //用快慢指针找链表的中心        ListNode *faster=head;        ListNode *slower=head;        while(faster->next!=NULL && faster->next->next!=NULL){            slower=slower->next;            faster=faster->next->next;        }        ListNode *head2=slower->next;        slower->next=NULL;        //逆转第二个子链表        faster=head2->next;        slower=head2;        while(faster){            ListNode *next=faster->next;            faster->next=slower;            slower=faster;            faster=next;        }        head2->next=NULL;        //将第二个子链表一次插到第一个中        ListNode *p1=head;        ListNode *p2=slower;        while(p2){            ListNode* p1Next=p1->next;            ListNode* p2Next=p2->next;            p1->next=p2;            p2->next=p1Next;            p1=p1Next;            p2=p2Next;        }    }};
0 0
原创粉丝点击