题目描述:
主要思路:
没有找到什么特殊的捷径,主要就是链表的一些基础操作。
实现了三个函数,一个是找到链表的中心结点,一个是将中心结点之后的链表进行翻转,另一个就是两段链表进行拼接。
class Solution {
public:
void reorderList(ListNode* head) {
if(head==nullptr)
return;
ListNode *mid=middle(head);
ListNode *l1=head,*l2=mid->next;
mid->next=nullptr;
l2 = reverselist(l2);
mergelist(l1,l2);
}
ListNode* middle(ListNode *head)
{
ListNode *slow=head,*fast=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
}
return slow;
}
ListNode* reverselist(ListNode* head)
{
ListNode *prev=nullptr,* curr=head;
while(curr)
{
ListNode *ne = curr->next;
curr->next = prev;
prev=curr;
curr=ne;
}
return prev;
}
void mergelist(ListNode* l1, ListNode * l2)
{
ListNode *l1_tmp,*l2_tmp;
while(l1&&l2)
{
l1_tmp = l1->next;
l2_tmp = l2->next;
l1->next = l2;
l1 = l1_tmp;
l2->next=l1;
l2 = l2_tmp;
}
}
};