您的位置:首页 > 其它

LeetCode Reorder List O(n) space空间解法

2013-11-04 10:49 295 查看
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}
.

前面用了O(1)空间的解法,但是我觉得不是那么好理解,然后向用O(n)空间,看看能不能加速一下运行速度。但是结果运行速度都是一样的。看来还是前面一种方法好点,不过这种方法的优点就是我觉得比较好理解。

解法:

1. 用vector存储Link

2. 用另外一个vector存储插入适当顺序的Link

3. 重新链接好各个->next,得到最终需要的Link结果

LeetCode论坛上的程序也是我贴的,链接:leetCode

程序如下:

class Solution {
public:
	void reorderList(ListNode *head) 
	{
		if(head==nullptr || head->next==nullptr ||head->next==nullptr) return;
		vector<ListNode *> vln;
		changeToVector(head, vln);
		vector<ListNode *> vlnOut;
		reodVector(vlnOut, vln);
		chainVec(vlnOut);
	}

	void changeToVector(ListNode *head, vector<ListNode *>& vln)
	{
		ListNode *ph = head;
		while (ph!=nullptr)
		{
			vln.push_back(ph);
			ph = ph->next;
		}
	}

	void reodVector(vector<ListNode *>& vlnOut, vector<ListNode *>& vlnIn)
	{
		int n = vlnIn.size();
		int r = (n-1)/2;
		int i = 0;
		int k = n-1;
		for (; k>=(n-r); i++, k--)
		{
			vlnOut.push_back(vlnIn[i]);
			vlnOut.push_back(vlnIn[k]);
		}
		while(i<n-r)
		{
			vlnOut.push_back(vlnIn[i]);
			i++;
		}
	}

	void chainVec(vector<ListNode *>& vln)
	{
		int n = vln.size();
		for (int i = 0; i < n-1; i++)
		{
			vln[i]->next = vln[i+1];
		}
		vln[n-1]->next = nullptr;
	}
};




4到5星级难度。
考点:
1 反转链表
2 两链表插入节点
3 找到特定节点

//2014-2-19 update
	void reorderList(ListNode *head)
	{
		int len = getLength(head);
		if (len < 3) return;
		int m = (len-1)>>1;
		ListNode *pre = head->next;
		ListNode *tail = pre->next;

		while (--m>0) tail = tail->next;
		while (tail->next)
		{
			pre = pre->next;
			tail = tail->next;
		}
		reverseList(pre);

		tail = pre->next;
		pre->next = nullptr;
		intertwinedList(head, tail);
	}
	void intertwinedList(ListNode *&h1, ListNode *h2)
	{
		ListNode *h = h1;
		while (h2)
		{
			ListNode *t = h2;
			h2 = h2->next;
			t->next = h->next;
			h->next = t;
			h = t->next;
		}
	}
	void reverseList(ListNode *&pre)
	{
		ListNode *tail = pre->next;
		while (tail->next)
		{
			ListNode *t = tail->next;
			tail->next = t->next;//错误:tail = t->next
			t->next = pre->next;
			pre->next = t;
		}
	}
	int getLength(ListNode *h)
	{
		int len = 0;
		for ( ; h; h = h->next) len++;
		return len;
	}


//2014-2-20 update
	void reorderList(ListNode *head)
	{
		if (!head || !head->next || !head->next->next) return;
		ListNode *pre = head->next;
		ListNode *tail = pre->next;

		while (tail && tail->next)
		{
			pre = pre->next;
			tail = tail->next->next;
		}
		reverseList(pre);

		tail = pre->next;
		pre->next = nullptr;
		intertwinedList(head, tail);
	}
	void intertwinedList(ListNode *&h1, ListNode *h2)
	{
		ListNode *h = h1;
		while (h2)
		{
			ListNode *t = h2;
			h2 = h2->next;
			t->next = h->next;
			h->next = t;
			h = t->next;
		}
	}
	void reverseList(ListNode *&pre)
	{
		ListNode *tail = pre->next;
		while (tail->next)
		{
			ListNode *t = tail->next;
			tail->next = t->next;//错误:tail = t->next
			t->next = pre->next;
			pre->next = t;
		}
	}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: