题目地址: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;
}
}
};