[LeetCode OJ] Reorder List 解题报告

题目地址:https://oj.leetcode.com/problems/reorder-list/

题意:将链表一分为二,后半部分链表再逆序插入前半部分链表

解题思路:用两个指针,一个一次移动一个节点,另一个一次移动两个节点,这样就能找到链表的中点,然后再将后半部分逆序,最后再合并两个链表。

注意:这里要注意链表节点数是奇数还是偶数的不同情况。

#include<iostream>
#include<string>
using namespace std;


class Solution {
public:
    void reorderList(ListNode *head){
        if(!head||!head->next) return;
        ListNode *List1=head,*List2=head->next,*pre=NULL,*ptr=NULL;
        bool flag=0; //记录链表长度是否为偶数
        while(List2!=NULL){
            pre = List1;
            List1=List1->next;
            List2=List2->next;
            if(List2 != NULL){
                List2=List2->next;
                if(List2 == NULL){//链表长度为奇数
					pre = List1;
                    List1 = List1->next;
                    pre->next = NULL;
                }
            }
            else{//链表长度为偶数
                pre->next=NULL;
            }
        }
        List2 = ptr = List1;
		pre = NULL;
		
        //逆序list2
        while(List2!=NULL){
            ptr = List2;
            List2 = List2->next;
            if(List2!=NULL){
                ptr->next = pre;
                pre = ptr;
                ptr = List2;
                List2=List2->next;
                if(List2==NULL){
                    ptr->next=pre;
                    List2 = ptr;
                    break;
                }
				else{
					ptr->next=pre;
					pre = ptr;
				}
            }
            else{
                ptr->next = pre;
                List2 = ptr;
                break;
            }
        }
        List1->next = NULL;
        List1 = head;
        mergeList(List1,List2);
        head=List1;
    }
    //合并链表
    void mergeList(ListNode *List1, ListNode *List2){
        ListNode *ptr1=List1,*ptr2=List2;
        ListNode *pre1=NULL,*pre2=NULL;
        while(ptr2){//只存在ptr1和ptr2都为空,和ptr2为空两种情况
            pre1 = ptr1, pre2=ptr2;
            ptr1 = ptr1->next;
            ptr2 = ptr2->next;
            pre1->next = pre2;
            pre2->next = ptr1;
        }
    }
};
点赞