题目来源:
https://leetcode-cn.com/problems/reorder-list/
题目描述:
算法描述:
分为三步
- 利用快慢指针找到链表的中间位置,从其后面拆开分成两半,保存后半部分的首节点,并把前半部分的最后一个节点的next指针置为NULL。
- 然后将后半部分链表逆置,并保存逆置后新链表的首节点。
- 最后从反转后的链表首节点开始,依次间隔一个位置插入到前半部分链表中。
代码如下:
class Solution {
public:
void reorderList(ListNode* head) {
if(!head || !head->next)
return;
ListNode *slow = head, *fast = head->next;
//快慢指针找到中点,将链表一分为二
while(fast && fast->next){
slow = slow->next;
fast = fast->next->next;
}
ListNode *head2 = slow->next;
//逆置后半部分链表
slow->next = NULL;
fast = head2->next;
head2->next = NULL;
while(fast){ //
slow = fast->next;
fast->next = head2;
head2 = fast;
fast = slow;
}
slow = head;
fast = head2;
//合并前半部分链表和逆置后的链表
ListNode *temp = NULL;
while(slow){
temp = slow->next;
slow->next = fast;
slow = slow->next;
fast = temp;
}
}
};