【发布时间】:2011-01-21 20:18:35
【问题描述】:
这是 Microsoft 在笔试期间提出的编程问题之一。我正在给出我想出的问题和答案。事情是我的回答虽然看起来很全面(至少对我来说),但我觉得可以减少行数。它是用 C 语言问的,我是 Java 人,但我设法编写了它(我的答案可能包含太多类似 Java 的语法)
好的,问题来了。
您已经有两个列表 排序后,您必须合并它们并 返回一个没有任何新额外内容的新列表 节点。返回的列表应该是 排序为好。
方法签名是,
Node* MergeLists(Node* list1, Node* list2);
struct Node{
int data;
Node *next;
}
以下是我想出的解决方案,
Node* MergeLists(Node* list1, Node* list2){
Node* mergedList;
if(list1 == null && list2 ==null){//if both are null, return null
return null;
}
if(list1 == null){//if list1 is null, simply return list2
return list2;
}
if(list2 == null){//if list2 is null, simply return list1
return list1;
}
if(list1.data < list2.data){//initialize mergedList pointer to list1 if list1's data is lesser
mergedList = list1;
}else{//initialize mergedList pointer to list2 if list2's data is lesser or equal
mergedList = list2;
}
while(list1!=null && list2!=null){
if(list1.data < list2.data){
mergedList->next = list1;
list1 = list1->next;
}else{
mergedList->next = list2;
list2 = list2->next;
}
}
if(list1 == null){//remaining nodes of list2 appended to mergedList when list1 has reached its end.
mergedList->next = list2;
}else{//remaining nodes of list1 appended to mergedList when list2 has reached its end
mergedList->next = list1;
}
return mergedList;
}
我非常有信心这可以得到加强。请帮我找出我添加的多余行。请随时批评我的语法错误和逻辑。
谢谢!
【问题讨论】:
-
您的一些代码可以简单地通过在开始时使用三元运算符来缩短。 I.E 使用 to mergeList = (list1 == null ? list2 : null) 重写参数测试并保存代码行,尽管“不是”操作。
-
Bragboy,您介意将您的标题更改为更具描述性的形式,例如“合并两个排序列表”吗?您当前的标题(需要您对此编码问题的建议/提示)是我们在这里的全部目的。 :) 它不会识别或宣传您的问题。
标签: c algorithm data-structures linked-list