【问题标题】:how to create recursive merge of 2 sorted lists resulting in sorted merged list如何创建2个排序列表的递归合并导致排序合并列表
【发布时间】:2013-02-16 17:04:52
【问题描述】:

我正在学习递归我试图通过合并 2 个排序列表来返回一个排序列表并且我迷路了。我知道这是不正确的,但任何指导都会有所帮助。

public static ArrayList<Integer> mergeMyList(ArrayList<Integer> list1, 
          ArrayList<Integer> list2)
{
    ArrayList<Integer> tempList = null;  
    int n = list1.size() +list2.size();
    int l = list2.size();

    if ( n == 0  && l == 0)
    {                        
        tempList = list1;
        return tempList;
    }
    if ( n == 0 )
    {                        
        tempList = list2;
        return tempList;
    }
    if ( l == 0)
    {                        
        tempList = list1;   
        return tempList;
    }

    else
    {   
        int x = list1.get(0); 
        int y = list2.get(0);

        if (x < y )
        {
            //  list1.add(x);
            //  list1.add(y); 
            tempList=list1;
            //  list1.remove(0);
            //  list2.remove(0);    

        }
        else
        {
            list1.add(y);                     
            tempList = list1;
            list1.remove(0);
            list2.remove(0);
            tempList = mergeMyList(list1,list2);
        }                   
    }
    tempList = mergeMyList(list1,list2);
    return tempList;
} 

【问题讨论】:

  • 既然已经有了两个排序列表,为什么还要使用递归呢?只需遍历它们并将最大值附加到新列表中即可。
  • 这正是我被问到的 - 我正在尝试帮助某人,但它有点超出我的范围
  • 感谢恩里克的评论

标签: java recursion merge


【解决方案1】:

可以缩短或更好,但我认为可以理解。

ArrayList<Integer> mergeList(ArrayList<Integer> list1, 
                             ArrayList<Integer> list2)
{
  ArrayList result = new ArrayList<Integer>();

  while (list1.size() > 0 && list2.size() > 0)
  {
    if (list1.get(0) < list2.get(0))   
       result.add(list1.remove(0));
    else
       result.add(list2.remove(0));
  }

  while (list1.size() > 0) result.add(list1.remove(0));
  while (list2.size() > 0) result.add(list2.remove(0));

  return result;
}

ArrayList<Integer> QuickSort(ArrayList<Integer> list)
{
  if (list.size() < 2)
    return list;

  ArrayList<Integer> left = list.subList(0, list.szie() / 2);
  ArrayList<Integer> right = list.subList(list.szie() / 2, 8);

  return mergeList(QuickSort(left), QuickSort(right));
}

这是一个递归快速排序的完整示例。它很快(有点),但需要大量空间,如果列表太大,可能会溢出堆栈。

递归合并:

ArrayList<Integer> mergeList(ArrayList<Integer> list1, 
                             ArrayList<Integer> list2)
{
  if (list1.size() == 0) return list2;
  if (list2.size() == 0) return list1;

  ArrayList result = new ArrayList<Integer>();

  if (list1.get(0) < list2.get(0))   
    result.add(list1.remove(0));
  else
    result.add(list2.remove(0));

  result.addAll(mergeList(list1, list2));

  return result;  
}

【讨论】:

  • 谢谢 Matzi 我已经有一个这样的方法我正在寻找一个递归的 - 非常感谢你的回复。
  • 我将它修改为一个完整的快速排序,它是递归的。还添加了有点毫无意义的递归合并。
  • 谢谢你!比我的努力好多了:-)
猜你喜欢
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 2012-01-18
  • 2019-04-07
  • 1970-01-01
  • 2019-03-20
  • 2018-01-04
相关资源
最近更新 更多