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

Java:合并两个已排序的链表,java,algorithm,merge,linked-list,Java,Algorithm,Merge,Linked List,我已经开发了一个代码来合并java中两个已经排序的链表 我需要以下方面的帮助: 如何在不使用tempNode的情况下保留合并列表的头节点的值 这个代码可以更好地优化吗 public static ListNode mergeSortedListIteration(ListNode nodeA, ListNode nodeB) { ListNode mergedNode ; ListNode tempNode ; if (nodeA == null) { retu

我已经开发了一个代码来合并java中两个已经排序的链表

我需要以下方面的帮助:

  • 如何在不使用tempNode的情况下保留合并列表的头节点的值
  • 这个代码可以更好地优化吗

    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;
    }
    
    公共静态ListNode合并分类识别(ListNode节点A、ListNodeB){
    ListNode合并节点;
    ListNode-tempNode;
    if(nodeA==null){
    返回基站;
    } 
    if(nodeB==null){
    返回nodeA;
    }     
    if(nodeA.getValue()

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


    2:没有,这里没有太多需要优化的地方。这个过程非常简单。

    有几种可能性:

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

    2) 使用双链接列表,然后使用
    nodeA.getPrev().getValue()
    nodeB.getPrev().getValue()
    而不是
    mergedNode
    。您还必须在这里处理边缘案例

    为了处理边缘情况,在调用
    getPrev()
    getNext()
    getValue()
    之前,必须保证引用不可能为
    null
    ,否则将引发异常


    注意,为了消除变量,上述修改稍微牺牲了执行时间和(更重要的)简单性。任何收益都是微乎其微的,开发人员的时间远比从操作中减少一两微秒重要。

    这是家庭作业吗?如果是这样的话,它应该被贴上这样的标签。不,这不是家庭作业。谢谢。那你为什么不使用Collections API呢?只需在第一个列表上迭代,使用
    ListIterator.add()
    ,比较并插入第二个列表中的项目即可。我正在为此编写自己的算法。所以不能使用集合API。好吧。。。是的,你可以。我在上一篇评论中刚刚描述了算法,使用现有的类编写算法会更容易(对其他人来说也更容易理解)。只是说说而已。