码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode_143_Reorder List

时间:2015-02-15 10:47:12      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:linked_list   c++   leetcode   

欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢技术分享


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:
    void reorderList(ListNode *head) {
        if(head==NULL)
			return;
		int len=getlistlen(head);
		ListNode *head1=NULL , *head2=NULL ;
		dividelist( head, len , head1 , head2 );
		head2 = reverseList(head2);
        mergeList(head1, head2);
    }
private:
	int getlistlen(ListNode *head)
	{
		int len=0;
		while(head)
		{
			len++;
			head = head->next;
		}
		return len;
	}

	void dividelist(ListNode *head , int len , ListNode *&head1 , ListNode *&head2)
	{
		int half = (len+1)/2;
		ListNode *first=head;
		head1 = head;
		for(int i=0; i<half-1; i++)
		{
			first = first->next;
		}
		head2 = first->next;
		first->next = NULL;
	}

	ListNode* reverseList(ListNode* head)
    {
		if( head == NULL)
			return NULL;
		ListNode *p = head->next;
		head->next = NULL;
		while(p)
		{
			ListNode *temp = p;
			p = p->next;
			temp->next = head;
			head = temp;
		}
		return head;
    }
    void mergeList(ListNode* head1, ListNode* head2)
    {
        while(head2)
		{
			ListNode *temp = head2;
			head2 = head2->next;

			temp->next = head1->next;
			head1->next = temp;
			head1 = head1->next->next;
		}
    }
};


#include<iostream>

using namespace std;

#define N 4

struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    void reorderList(ListNode *head) {
        if(head==NULL)
			return;
		int len=getlistlen(head);
		ListNode *head1=NULL , *head2=NULL ;
		dividelist( head, len , head1 , head2 );
		head2 = reverseList(head2);
        mergeList(head1, head2);
    }
private:
	int getlistlen(ListNode *head)
	{
		int len=0;
		while(head)
		{
			len++;
			head = head->next;
		}
		return len;
	}

	void dividelist(ListNode *head , int len , ListNode *&head1 , ListNode *&head2)
	{
		int half = (len+1)/2;
		ListNode *first=head;
		head1 = head;
		for(int i=0; i<half-1; i++)
		{
			first = first->next;
		}
		head2 = first->next;
		first->next = NULL;
	}

	ListNode* reverseList(ListNode* head)
    {
		if( head == NULL)
			return NULL;
		ListNode *p = head->next;
		head->next = NULL;
		while(p)
		{
			ListNode *temp = p;
			p = p->next;
			temp->next = head;
			head = temp;
		}
		return head;
    }
    void mergeList(ListNode* head1, ListNode* head2)
    {
        while(head2)
		{
			ListNode *temp = head2;
			head2 = head2->next;

			temp->next = head1->next;
			head1->next = temp;
			head1 = head1->next->next;
		}
    }
};

ListNode *creatlist()
{
	ListNode *head = NULL;
	ListNode *p;
	for(int i=0; i<N; i++)
	{
		int a;
		cin>>a;
		p = (ListNode*) malloc(sizeof(ListNode));
		p->val = a;
		p->next = head;
		head = p;
	}
	return head;
}

int main()
{
	ListNode *list = creatlist();
	Solution lin;
	lin.reorderList(list);
	for(int i=0; i<N; i++)
	{
		cout<<list->val;
		list = list->next;
	}

	return 0;
}


leetcode_143_Reorder List

标签:linked_list   c++   leetcode   

原文地址:http://blog.csdn.net/keyyuanxin/article/details/43833365

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!