本题的思路:
1.将原链表从中间分成两个链表A,B。
2.逆置B,此处可根据逆序伐穿件链表来做。
3.然后针对每个元素依次合并A,B。
代码
ListNode* reverseList(ListNode*head)
{
ListNode* p, *headtemp;
p = head;
headtemp = new ListNode(0);
while(p!=NULL)
{
ListNode * q;
q = p;
p = p->next;
q->next = headtemp->next;
headtemp->next = q;
}
return headtemp->next;
}
ListNode * mergeLists(ListNode *head1, ListNode *head2)
{
ListNode *pnext1, *pnext2, *p, *q;
pnext1 = head1;
pnext2 = head2;
q = new ListNode(0);
p = q;
while(pnext1!=NULL&&pnext2!=NULL)
{
p ->next = pnext1;
pnext1 = pnext1->next;
p = p->next;
p->next = pnext2;
pnext2 = pnext2->next;
p = p->next;
}
if(pnext1!=NULL)
p->next = pnext1;
if(pnext2!=NULL)
p->next = pnext2;
return q->next;
}
ListNode* reorderList(ListNode *head)
{
if(head==NULL)
return ;
ListNode *fast, *slow, *last;
slow = head;
fast = head;
while(slow->next!=NULL&&fast->next!=NULL&&fast->next->next!=NULL)
{
slow = slow->next;
fast = fast->next->next;
}
ListNode * head2;
head2 = slow->next;
slow->next = NULL;
//反转后半部分链表
head2 = reverseList(head2);
//合并两个链表
head = mergeLists(head, head2);
}