题解 | #重排链表#
重排链表
http://www.nowcoder.com/practice/3d281dc0b3704347846a110bf561ef6b
/**
* 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,*slow=head;//快慢指针
while(fast->next!=NULL&&fast->next->next!=NULL){
fast=fast->next->next;
slow=slow->next;
}
//循环结束后,slow指针指向的节点就是左半区最后一个节点
ListNode*newHead=slow->next;
newHead=reverselist(newHead);//反转链表
slow->next=NULL;
ListNode*head1=head,*head2=newHead;//两个链表的头
head=NULL;
ListNode*p=NULL;//给head链表使用
//每次从两个链表上各取一个节点
ListNode*next1=NULL,*next2=NULL;
while(head1&&head2){
next1=head1->next;
next2=head2->next;
//从第一个链表上取一个节点
if(head==NULL){
head=head1;
p=head1;
}
else{
p->next=head1;
p=head1;
}
//从第二个链表上取一个节点
p->next=head2;
p=p->next;
head1=next1;
head2=next2;
}
if(head1){//head1如果不空
p->next=head1;
p=p->next;
}
p->next=NULL;
return;
}
//反转一个单链表的函数
ListNode* reverselist(ListNode *head){
if(head==NULL||head->next==NULL)
return head;
ListNode*pre=NULL,*cur=head,*next=NULL;
while(cur){
next=cur->next;
cur->next=pre;
pre=cur;
cur=next;
}
return pre;//返回反转之后链表的头结点
}
};
* 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,*slow=head;//快慢指针
while(fast->next!=NULL&&fast->next->next!=NULL){
fast=fast->next->next;
slow=slow->next;
}
//循环结束后,slow指针指向的节点就是左半区最后一个节点
ListNode*newHead=slow->next;
newHead=reverselist(newHead);//反转链表
slow->next=NULL;
ListNode*head1=head,*head2=newHead;//两个链表的头
head=NULL;
ListNode*p=NULL;//给head链表使用
//每次从两个链表上各取一个节点
ListNode*next1=NULL,*next2=NULL;
while(head1&&head2){
next1=head1->next;
next2=head2->next;
//从第一个链表上取一个节点
if(head==NULL){
head=head1;
p=head1;
}
else{
p->next=head1;
p=head1;
}
//从第二个链表上取一个节点
p->next=head2;
p=p->next;
head1=next1;
head2=next2;
}
if(head1){//head1如果不空
p->next=head1;
p=p->next;
}
p->next=NULL;
return;
}
//反转一个单链表的函数
ListNode* reverselist(ListNode *head){
if(head==NULL||head->next==NULL)
return head;
ListNode*pre=NULL,*cur=head,*next=NULL;
while(cur){
next=cur->next;
cur->next=pre;
pre=cur;
cur=next;
}
return pre;//返回反转之后链表的头结点
}
};