这题的意思是依次把倒数第n个节点插到正数第n个结点之后
1)找到中间结点,把原链表分为前后两个部分,中间结点是前边链表的尾,其next 是第二个链表的头
快慢指针法,快指针q走2步,慢指针p走1步,q走到结尾时候p对应中间结点。这里的“结尾”有可能是NULL也有可能是最后一个结点,因为循环条件是q && q->next。这里的中间结点对于len为奇数的链表是真正的中间结点,对于len为偶数的链表中间结点是中间两个结点后边那个。中间结点的next作为第二个链表的head。
2)reverse第二个链表(头插法)
3)遍历二个链表依次插入第一个链表相应结点之后
void reorderList(ListNode *head) {
if(!head || !head->next || !head->next->next) return;
ListNode *p=head, *q=head;
while(q && q->next)
{
p=p->next;
q=q->next->next;
}
ListNode *head2 = p->next;
p->next=NULL;
head2=reverse(head2);
while(head2)
{
ListNode *next= head->next;
head->next=head2;
head2=head2->next;
head->next->next=next;
head = next;
}
}
ListNode* reverse(ListNode *head)
{
ListNode* head2= NULL;
while(head)
{
ListNode *next= head->next;
head->next=head2;
head2=head;
head=next;
}
return head2;
}