通过递归 - c++ 将排序的两个链表合并到第三个链表中

Merge sort two linked list into a third linked list via recursion - c++

本文关键字:链表 两个 合并 三个 递归 c++ 排序      更新时间:2023-10-16

所以基本上,我必须将两个链表(作为参数传递)合并到第三个链表(也作为参数传入)中 - 但是在函数结束时,新列表仍然必须排序,其他链表必须为空。我很确定我很接近,但由于某种原因,我认为第三个列表的计算不正确。如果有人能看一看并很快告诉我我错在哪里,那将是很棒的,考虑到我不擅长递归。最后,headX 和 headY 都应该是空的,它们的所有项目都按 headZ 排序。但是,在函数完成后,headZ 不正确(尽管我不确定为什么)。

void   sortedMergeRecur(Node* &headX, Node* &headY, Node* &headZ)
{
  // we can assume that both headx and heady are sorted linkedlists
  // first establish base case or when to stop
  if((headX == 0) && (headY != 0))
  {
    // x is empty, but y is not
    headZ = headY;
    headY = 0;
    return;
  }
  else if((headY == 0) && (headX != 0))
  {
    // y is empty, but x is not
    headZ = headX;
    headX = 0;
    return;
  }
  else if((headY == 0) && (headX == 0))
  {
    // if they're both empty, we don't need to add anything z
    headZ = 0;
    return;
  }
  // Pick either x or y to add
  if (headX->data <= headY->data)
  {
    headZ = headX;
    SortedMergeRecur(headX->link, headY, headZ->link);
    headX = 0;
  }
  else // if(headX->data > headY->data)
  {
    headZ = headY;
    SortedMergeRecur(headX, headY->link, headZ->link);
    headY = 0;
  }

  return;
}

更新 - 您需要在合并排序期间前进 headX 或 headY。此外,还可以简化空列表检查。这个例子似乎有效:

void SortedMergeRecur(Node* &headX, Node* &headY, Node* &headZ)
{
    // assume that both headX and headY are sorted linkedlists
    // check for empty lists
    if(headX == 0)
    {
        headZ = headY;
        headY = 0;
        return;
    }
    if(headY == 0)
    {
        headZ = headX;
        headX = 0;
        return;
    }
    // move smaller of X,Y to Z
    if (headX->data <= headY->data)
    {
        headZ = headX;
        headX = headX->link;
        SortedMergeRecur(headX, headY, headZ->link);
    }
    else
    {
        headZ = headY;
        headY = headY->link;
        SortedMergeRecur(headX, headY, headZ->link);
    }
    return;
}