Reorder List(C++重排链表)

(1)寻找中点,断点

(2)反转链表

(3)合并链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        ListNode *slow=head,*fast=head;
        while(fast!=nullptr && fast->next!=nullptr) {
            slow=slow->next;
            fast=fast->next->next;
        }
        return slow;
    }
    
    ListNode* reverseList(ListNode* head) {
        ListNode *pre=nullptr,*cur=head;
        while(cur) {
            ListNode *temp=cur->next;
            cur->next=pre;
            pre=cur;
            cur=temp;
        }
        return pre;
    }
    
    ListNode* merge(ListNode* head1,ListNode* head2) {
        ListNode *phead1=head1,*phead2=head2;
        while(phead1!=nullptr && phead2!=nullptr) {
            ListNode *p1=phead1->next;
            ListNode *p2=phead2->next;
            phead1->next=phead2;
            if(p1==nullptr) {
                phead2->next=p2;
            } else phead2->next=p1;
            
            phead1=p1;
            phead2=p2;
        }
        return head1;
    }
    
    void reorderList(ListNode* head) {
        ListNode* l=middleNode(head);
        ListNode* mid=l->next;
        l->next=nullptr;
        mid=reverseList(mid);
        merge(head,mid);
        return;
    }
};

 


版权声明:本文为coolsunxu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。