题目描述:
Given a singly linked list L: L 0→L 1→…→L n-1→L n,
reorder it to: L 0→L n →L 1→L n-1→L 2→L n-2→…
You must do this in-place without altering the nodes' values.
For example,
Given{1,2,3,4}, reorder it to{1,4,2,3}.
题目解析:
一个链表为:L 0→L 1→…→L n-1→L n
将链表重排为:L 0→L n →L 1→L n-1→L 2→L n-2→ 的形式。
思路:使用快慢指针将两个链表一分为二,对slow后面的链表进行逆序,最后将两个链表合并为一个。
AC代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorderList(ListNode *head) {
if(head == NULL || head->next == NULL || head->next->next == NULL)
return;
//使用快慢指针找到链表的中点,偶数个节点,中点偏左
ListNode* fast = head;
ListNode* slow = head;
while(fast->next && fast->next->next)
{
slow = slow->next;
fast = fast->next->next;
}
//以中心为界,将链表分为两部分,将后面的部分逆置
//1-2-3-4-5 1-2-3-NULL 4-5-NULL 5-4-NULL
fast = slow->next;
slow->next = NULL;
slow = fast; //slow指向后面链表的头
//将slow及后面进行逆置
fast = slow->next;
slow->next = NULL;
ListNode* tmp;
while(fast != NULL)
{
tmp = fast->next;
fast->next = slow;
slow = fast;
fast = tmp;
}
//合并两个链表
ListNode* p = head;
ListNode* q = slow;
while(p != NULL && q != NULL)
{
tmp = p->next;
p->next = q;
p = tmp;
tmp = q->next;
q->next = p;
q = tmp;
}
}
};
(*^▽^*)