Java:合并两个已排序的链接列表

时间:2012-07-24 14:11:40

标签: java algorithm merge linked-list

我开发了一个代码来合并两个已经排序的链接列表。

我需要以下方面的帮助:

  1. 如何在不使用tempNode的情况下保留合并列表的头节点的值?
  2. 此代码可以更好地优化吗?

    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;
    }
    

2 个答案:

答案 0 :(得分:2)

1:您必须保留第一个节点的记录,这意味着您必须将其存储在tempNode等变量中。

2:不。这里没有太多优化。这个过程非常简单。

答案 1 :(得分:2)

有几种可能性:

1)使用mergedNodenodeA.getNext().getValue(),而不是使用nodeB.getNext().getValue()来跟踪上一个节点。您的算法将变得更加复杂,您将不得不处理一些边缘情况,但可以消除您的一个变量。

2)使用双向链表,然后使用nodeA.getPrev().getValue()nodeB.getPrev().getValue()代替mergedNode。你也必须在这里处理边缘情况。

为了处理边缘情况,您必须保证在致电nullgetPrev()getNext()之前,您的参考文件可能不是getValue(),否则你会抛出异常。

注意,为了消除变量,上述修改略微牺牲了执行时间并且(更重要的是)简单性。任何收益都是微不足道的,而且开发人员的时间比削减一两微秒的操作要重要得多。