`
java-mans
  • 浏览: 11413259 次
文章分类
社区版块
存档分类
最新评论

微软暑期实习笔试题 合并两个有序单链表

 
阅读更多

当时做这一题的时候就感觉有点繁琐,其实也不难。感觉面试官就是想看看自己的基础水平在哪里。

当自己不想写,有必须要写的时候才发现很繁琐。原来打算20行都不要,却越写越多,有的地方居然挤不下。

最后只能时间到了,我还在纠结,因为给的是5分钟的时间。我自己也没想到居然没搞定。我还介绍了思路,但显然不是面试官想要的结果。他认为时间应该是绰绰有余的。

回来之后痛定思痛!自己静下心来,慢慢写,10分钟,测试成功。代码如下,希望看官能与我交流。

pnode merge_list(pnode L,pnode R)
{
	if (L==NULL)
	{
		return R;
	}
	else if (R==NULL)
	{
		return L;
	}
	else
	{
		pnode head=NULL,p=NULL;
		head=p=new node;
		if (L->data<R->data)
		{
			head->data=L->data;
			L=L->next;
		}
		else if (R->data < L->data)
		{
			head->data=R->data;
			R=R->next;
		}
		else
		{
			head->data=L->data;
			L=L->next;
			R=R->next;
		}
		while(L&&R)
		{
			p->next=new node;
			if (L->data<R->data)
			{
				p->next->data=L->data;
				L=L->next;
			}
			else if (R->data < L->data)
			{
				p->next->data=R->data;
				R=R->next;
			}
			else
			{
				p->next->data=L->data;
				L=L->next;
				R=R->next;
			}
			p=p->next;
		}
		while (L)
		{
			p->next=new node;
			p->next->data=L->data;
			L=L->next;
			p=p->next;
		}
		while (R)
		{
			p->next=new node;
			p->next->data=R->data;
			R=R->next;
			p=p->next;
		}
		return head;
	}
}


上面的实现有不少漏洞,甚至是错误的,比如简单的处理为 return R,return L 。这是导致内存泄露的源泉!!
现在以面向对象的方式再次实现如下,欢迎批评指正。

void list_::push_back(const int& value)
{
	if (this->tail_==NULL)
	{
		this->head_=this->tail_=new node;
		this->tail_->data=value;
	}
	else
	{
		this->tail_->next=new node;
		this->tail_->next->data=value;
		this->tail_=this->tail_->next;
	}
}
void list_::merge_list(const list_& L,const list_& R,list_& result)
{
	if (L.head_==NULL)
	{
		result= R;
	}
	else if (R.head_==NULL)
	{
		result= L;
	}
	else
	{
		pnode pL=L.head_;
		pnode pR=R.head_;
		while(pL&&pR)
		{
			if (pL->data < pR->data)
			{
				push_back(pL->data);
				pL=pL->next;
			}
			else if (pR->data < pL->data)
			{
				push_back(pR->data);
				pR=pR->next;
			}
			else
			{
				push_back(pL->data);
				pL=pL->next;
				pR=pR->next;
			}
		}
		while (pL)
		{
			push_back(pL->data);
			pL=pL->next;
		}
		while (pR)
		{
			push_back(pR->data);
			pR=pR->next;
		}
	}
}


其中result =R用到了赋值操作符,其实现如下:

list_& list_::operator=(const list_& from)
{
	copy(from);
	return *this;
}

void list_::copy(const list_& from)
{
	pnode p=from.head_;
	while (p)
	{
		push_back(p->data);
		p=p->next;
	}
}


欢迎批评指正!!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics