[LeetCode]Reorder List

Given a singly linked list L: L0L1→…→Ln-1Ln, reorder it to: L0LnL1Ln-1L2Ln-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(n2)方法这里就不贴了。因为每次要插入的结点都是尾结点,从头结点开始寻找时间都花费在查询上。题意说只可以改变.next,这算是一个提示吧。我们可以翻转待插入链表结点,这样每次查询尾结点时间为O(1),极大减小时间复杂度。翻转链表,合并链表,非常棒的一道题目。

class Solution {
public:
	ListNode *Reverse(ListNode *head)
	{
		if(!head||!head->next) return head;
		ListNode *p=head;
		ListNode *q=p->next;
		while(q)
		{
			p->next=q->next;
			q->next=head;
			head=q;
			q=p->next;
		}
		return head;
	}
	ListNode *Merge(ListNode *head1,ListNode *head2)
	{
		ListNode *p=head1;
		ListNode *q=head2;
		ListNode *pN,*qN;
		while(q)
		{
			pN=p->next;
			qN=q->next;
			p->next=q;
			q->next=pN;
			p=pN;
			q=qN;
		}
		return head1;
	}
    void reorderList(ListNode *head) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
		if(!head||!head->next||!head->next->next) return;
		ListNode *p;
		p=head;
		int num=0;
		while(p)
		{
			p=p->next;
			num++;
		}
		if(num%2) num=num/2;
		else num=num/2-1;
		p=head;
		while(num--)
			p=p->next;
		ListNode *head2=p->next;
		p->next=NULL;
		head2=Reverse(head2);
		head=Merge(head,head2);
    }
};

  

posted @ 2013-11-16 10:49  七年之后  阅读(293)  评论(0编辑  收藏  举报