LeetCode143. Reorder List

Given a singly linked list LL0→L1→…→Ln-1→Ln,
reorder it to: L0→LnL1→Ln-1→L2→Ln-2→…

You may not modify the values in the list's nodes, only nodes itself may be changed.

Example 1:

Given 1->2->3->4, reorder it to 1->4->2->3.

Example 2:

Given 1->2->3->4->5, reorder it to 1->5->2->4->3.

Problem-solving ideas:

1. The list is divided into two portions, and the front and rear portions of an equal or large. (Pointer speed !!!)

2. The rear portion of the reverse.

3. The two parts together.

/**
 * 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) {
        if(head==NULL||head->next==NULL||head->next->next==NULL)
            return ;
        ListNode* slow=head;
        ListNode* fast=head;
        while(fast->next!=NULL) //find mid
        {
            fast=fast->next;
            if(fast->next==NULL) break;
            fast=fast->next;
            slow=slow->next;
        }
        ListNode* head2=slow->next;
        slow->next=NULL;
        ListNode* cur=head2;
        ListNode* nex=cur->next;
        cur->next=NULL;
        while(nex!=NULL)
        {
            ListNode* tmp=nex->next;
            nex->next=cur;
            cur=nex;
            nex=tmp;
        }
        head2=cur;
        ListNode* left1=head;
        ListNode* left2=head->next;
        ListNode* right1=cur;
        ListNode* right2=cur->next;
        while(right1!=NULL)
        {
            left1->next=right1;
            right1->next=left2;
            left1=left2;
            right1=right2;
            if(right2==NULL) break;
            left2=left2->next;
            right2=right2->next;
        }
    }
};

 

Guess you like

Origin blog.csdn.net/ueh286/article/details/91862637