当时做这一题的时候就感觉有点繁琐,其实也不难。感觉面试官就是想看看自己的基础水平在哪里。
当自己不想写,有必须要写的时候才发现很繁琐。原来打算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; } }
欢迎批评指正!!
微软暑期实习笔试题 合并两个有序单链表
最新推荐文章于 2024-08-25 09:57:22 发布