class Solution {
private:
ListNode* reverseList(ListNode * head){
if (head == NULL || head->next == NULL) return head;
ListNode *pre = NULL, *cur = head,*tmp;
while (cur->next){
tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
cur->next = pre;
return cur;
}
public:
void reorderList(ListNode *head) {
//注意空和只有一个节点
if (head == NULL||head->next==NULL) return;
//快慢指针找中间,1->2->3->4->null则slow=3 1->2->3->null则slow=2
ListNode *slow=head, *quick=head;
while (quick&&quick->next){
quick = quick->next->next;
slow = slow->next;
}
//让slow指向后半段+1个,使得后半段少一点
if (quick) slow = slow->next;
quick = head;
//找到需要断开的位置
while (quick->next != slow) quick = quick->next;
quick->next = NULL;
//翻转
slow = reverseList(slow);
quick = head;
//合并
while (quick&&slow){
ListNode* tmp1 = slow->next;
ListNode* tmp2 = quick->next;
slow->next = quick->next;
quick->next = slow;
slow = tmp1;
quick = tmp2;
}
}
};
转载于:https://my.oschina.net/zwj0571/blog/335823