描述
思路
一、暴力(循环遍历链表,第一个节点后接最后一个节点,第二个接点接倒数第二个节点,以此类推)
具体:
定义指针P指向头节点,每次找到链表的最后一个节点将其接在p所指节点的后面,p指向下一个节点, 直到p后面节点数小于两个。
class Solution {
public:
void reorderList(ListNode *head) {
if(head == NULL)return ;
ListNode* p = head;
while(p->next && p->next->next)
{
ListNode* pre = p->next;
ListNode* cur = p->next->next;
while(cur->next)
{
pre = pre->next;
cur = cur->next;
}
//3步
pre->next = NULL;
cur->next = p->next;
p->next = cur;
//
p=p->next->next;
}
}
};
二、寻找链表中点 + 链表逆序 + 合并链表
1、寻找链表中点
使用快慢指针,慢指针每次走一步,快指针每次走两步,当快指针走完时,慢指针正好到达中点。
ListNode* GetMid(ListNode* head)
{
ListNode* slow = head,*fast = head;
while(fast->next && fast->next->next)
{
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
2、反转链表
ListNode* ReverseList(ListNode* head)
{
ListNode* cur= head;
ListNode* pre = NULL;
while(cur)
{
ListNode* temp = cur->next;
cur->next = pre;
pre = cur ;
cur = temp;
}
return pre;
}
3、合并两个链表
void MerList(ListNode* head1, ListNode* head2)
{
ListNode* temp1;
ListNode* temp2 ;
while(head1 && head2)
{
temp1 = head1->next;
temp2 = head2->next;
head1->next = head2;
head2->next = temp1;
head1 = temp1;
head2 = temp2;
}
}
4、重排
void reorderList(ListNode *head) {
if(head == NULL)return ;
ListNode* mid = GetMid(head);
ListNode* head1 = head;
ListNode* head2 = mid->next;
mid->next = NULL;
head2 = ReverseList(head2);
MerList(head,head2);
}
代码
class Solution {
public:
ListNode* GetMid(ListNode* head)
{
ListNode* slow = head,*fast = head;
while(fast->next && fast->next->next)
{
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
ListNode* ReverseList(ListNode* head)
{
ListNode* cur= head;
ListNode* pre = NULL;
while(cur)
{
ListNode* temp = cur->next;
cur->next = pre;
pre = cur ;
cur = temp;
}
return pre;
}
void MerList(ListNode* head1, ListNode* head2)
{
ListNode* temp1;
ListNode* temp2 ;
while(head1 && head2)
{
temp1 = head1->next;
temp2 = head2->next;
head1->next = head2;
head2->next = temp1;
head1 = temp1;
head2 = temp2;
}
}
void reorderList(ListNode *head) {
if(head == NULL)return ;
ListNode* mid = GetMid(head);
ListNode* head1 = head;
ListNode* head2 = mid->next;
mid->next = NULL;
head2 = ReverseList(head2);
MerList(head,head2);
}
};