[LeetCode] Reorder List

Reorder List

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) {
        if(head==NULL){
            return;
        }
        int len = getListLength(head);
        ListNode* head1 = new ListNode(0);
        ListNode* head2= new ListNode(0); //head2表示后半部分倒转
        head1->next = head;
        ListNode* p = head1;
        for(int i=(len+1)/2; i>0; i--){
            p=p->next;
        }
        //此时p表示head1前一个节点
        ListNode* q=p->next;
        p->next=NULL;
        //将后半部分翻转到head2中
        while(q!=NULL){
            p=q->next;
            q->next=head2->next;
            head2->next=q;
            q=p;
        }
        //将两个链表合并
        p=head1->next;
        while(head2->next!=NULL){
            q=head2->next;
            head2->next = q->next;
            q->next=p->next;
            p->next=q;
            p=q->next;
        }
        head=head1->next;
        delete head1;
        delete head2;
    }
    
    int getListLength(ListNode* head){
        int len = 0;
        while(head!=NULL){
            len++;
            head=head->next;
        }
        return len;
    }
};


你可能感兴趣的:(LeetCode,C++)