Reorder List :
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Submission Result: Runtime Error
Last executed input: {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45.....,511}目前还不知道如何改进。
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-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}.
class Solution {
public:
ListNode *midnode(ListNode *head) //get the midnode of list
{
ListNode *first=head,*twice=head;
while(twice->next->next!=NULL)
{
twice=twice->next->next;
first=first->next;
}
return first;
}
ListNode *reverse(ListNode *head)//reverse the second part of the list
{
ListNode *prenode=head,*currnode=head,*nextnode=head->next;
prenode->next=NULL;
while(nextnode)
{
currnode=nextnode;
nextnode=nextnode->next;
currnode->next=prenode;
prenode=currnode;
}
return currnode;
}
void ordernode(ListNode *head1,ListNode *head2)//combine two lists in order
{
ListNode *curr1=head1->next,*temp=head1->next;
ListNode *curr2=head2;
while(curr2)
{
curr1=curr1->next;
temp->next=curr2;
curr2=curr2->next;
temp=temp->next->next=curr1;
temp=curr1;
}
}
void reorderList(ListNode *head) {
ListNode *mid=NULL,*midnext=NULL;
if(head==NULL||head->next==NULL)
cout<<"empty list"<<"\n"; //judgment of empty list
else if(head->next->next==NULL||head->next->next->next==NULL)
cout<<head->next<<" "<<head->next->next<<"\n"; //the list just has one or two nodes
else
{
mid=midnode(head);//get the mid element of list
midnext=mid->next->next;
mid->next->next=NULL;//divide the list into two parts
ordernode(head,reverse(midnext));
}
}
};
LeetCode 测试的结果:
Submission Result: Runtime Error
Last executed input: {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45.....,511}目前还不知道如何改进。