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

时间:2015-08-27 02:03:33

标签: c++ linked-list

我正在尝试编写一个程序来合并两个已排序的链表。但是最后一个元素根本没有插入。尝试在listA中的最后一个节点之后插入节点时,代码似乎失败。任何帮助将不胜感激。

  /*
      Merge two sorted lists A and B as one linked list
      Node is defined as 
      struct Node
      {
         int data;
         struct Node *next;
      }
    */
    Node* MergeLists(Node *headA, Node* headB)
    {
      // This is a "method-only" submission. 
      // You only need to complete this method 
      Node *prev;
      Node *currentA=headA;
      Node *currentB=headB;
      Node *next;
        if(headA==NULL)
            {
            return headB;
        }
        if(headB==NULL)
            {
            return headA;
        }
      while(currentA!=NULL && currentB!=NULL)
          {
        if(currentB->data < currentA->data)
            {
            Node *new_node=new Node;
            new_node->data=currentB->data;
            headA=new_node;
            new_node->next=currentA;
            currentA=new_node;
            currentB=currentB->next;
        }
        else if(currentB->data > currentA->data && currentB->data < currentA->next->data)
            {
            Node *new_node=new Node;
            new_node->data=currentB->data;
            next=currentA->next;
            prev=currentA;
            new_node->next=next;
            prev->next=new_node;
            currentA=new_node;
            currentB=currentB->next;

        }
        else
            {
            currentA=currentA->next;

        }
          if(currentA->next==NULL)
              {
              Node *new_node=new Node;
              new_node->data=currentB->data;
              prev=currentA;
              prev->next=new_node;
              new_node->next=NULL;
              currentA=new_node;
              currentB=currentB->next;
          }
      }
        return headA;
    }

输入:

1 (No of test cases)
2 (Length of list A)
2 4
4 (Length of list B)
1 3 5 7

预期产出:

1 2 3 4 5

实际输出:

Runtime error

2 个答案:

答案 0 :(得分:1)

我认为真正的问题在于您的意见。

1(测试用例数)

2(清单A的长度)

2 4

2(列表B的长度)

1 3 5

列表B的长度应为3.正如您在输入中提到的那样2。您的输出只包含列表B中的2个元素。

请检查正确的输入,如下所示:

1(测试用例数)

2(清单A的长度)

2 4

3(清单B的长度)

1 3 5

答案 1 :(得分:0)

当代码到达列表A或列表B的末尾时,它缺少复制列表A或列表B的剩余部分的代码。我还想知道使用currentA->的检查。设置currentA = currentA-&gt; next后,接下来可能为NULL。

代码也很复杂,如果(currentB-&gt; data&lt; currentA-&gt;数据),您从列表B移动或复制节点,否则您从列表A移动或复制节点,那里&#39;如果在if(currentB-&gt; data&lt; currentA-&gt; data)之后,只要其他就足够了,就不需要复杂的其他。

代码可以简化:

    prev = NULL;    /* this will be sorted list */
    /* ... */
        if(prev == NULL){     /* if first element */
            prev = new_node;
            next = new_node;
        } else {
            next->next = new_node;
            next = new_node;
        }
    /* ... */
    next->next = NULL;        /* set end of list */

您可能需要考虑将prev的名称更改为head和next ..

通常,合并列表函数将列表A和列表B中的节点移动到已排序的输出列表中,而不是创建节点的副本列表。在这种情况下,永远不会使用新节点,列表A和列表B中的现有节点将按顺序链接在一起。