C++编程学习之leetCode OJ

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,

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}目前还不知道如何改进。

你可能感兴趣的:(LeetCode,链表,指针)