我开发了一个代码来合并两个已经排序的链接列表。
我需要以下方面的帮助:
此代码可以更好地优化吗?
public static ListNode mergeSortedListIteration(ListNode nodeA, ListNode nodeB) {
ListNode mergedNode ;
ListNode tempNode ;
if (nodeA == null) {
return nodeB;
}
if (nodeB == null) {
return nodeA;
}
if ( nodeA.getValue() < nodeB.getValue())
{
mergedNode = nodeA;
nodeA = nodeA.getNext();
}
else
{
mergedNode = nodeB;
nodeB = nodeB.getNext();
}
tempNode = mergedNode;
while (nodeA != null && nodeB != null)
{
if ( nodeA.getValue() < nodeB.getValue())
{
mergedNode.setNext(nodeA);
nodeA = nodeA.getNext();
}
else
{
mergedNode.setNext(nodeB);
nodeB = nodeB.getNext();
}
mergedNode = mergedNode.getNext();
}
if (nodeA != null)
{
mergedNode.setNext(nodeA);
}
if (nodeB != null)
{
mergedNode.setNext(nodeB);
}
return tempNode;
}
答案 0 :(得分:2)
1:您必须保留第一个节点的记录,这意味着您必须将其存储在tempNode
等变量中。
2:不。这里没有太多优化。这个过程非常简单。
答案 1 :(得分:2)
有几种可能性:
1)使用mergedNode
和nodeA.getNext().getValue()
,而不是使用nodeB.getNext().getValue()
来跟踪上一个节点。您的算法将变得更加复杂,您将不得不处理一些边缘情况,但可以消除您的一个变量。
2)使用双向链表,然后使用nodeA.getPrev().getValue()
和nodeB.getPrev().getValue()
代替mergedNode
。你也必须在这里处理边缘情况。
为了处理边缘情况,您必须保证在致电null
,getPrev()
或getNext()
之前,您的参考文件可能不是getValue()
,否则你会抛出异常。
注意,为了消除变量,上述修改略微牺牲了执行时间并且(更重要的是)简单性。任何收益都是微不足道的,而且开发人员的时间比削减一两微秒的操作要重要得多。