【LeetCode】剑指 Offer II 026. 重排链表

class Solution {
public:
    void reorderList(ListNode* head) {
        if(head==nullptr){
            return;
        }
        ListNode* mid = findMiddle(head);
        ListNode* l1=head;
        ListNode* l2=mid->next;
        mid->next = nullptr;
        l2 = reverseList(l2);
        mergeList(l1,l2);
    }

    ListNode * findMiddle(ListNode*  head){
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast->next!=NULL&&fast->next->next!=NULL){
            slow=slow->next;
            fast=fast->next->next;
        }
        return slow;
    }

    ListNode * reverseList(ListNode* head){
        ListNode* pre = NULL;
        ListNode* cur = head;
        while(cur){
            ListNode* nextTemp=cur->next;
            cur->next=pre;
            pre=cur;
            cur=nextTemp;
        }
        return pre;
    }

    void mergeList(ListNode * l1,ListNode * l2)
    {
        ListNode* l1_tmp;
        ListNode* l2_tmp;
        while(l1!=nullptr && l2!= nullptr){
            l1_tmp=l1->next;
            l2_tmp=l2->next;

            l1->next = l2;
            l1=l1_tmp;

            l2->next=l1;
            l2 = l2_tmp;
        }
    }
};

思路:这道题可以转化为把一个链表分为前后两部分,首先找到中点,再把第二个部分原地翻转,最后组合前后两个部分,这样就可以实现链表的翻转

posted @ 2022-02-23 00:29  Jerry2km1  阅读(44)  评论(0)    收藏  举报