如何将已排序的链表插入到另一个已排序的链表中,同时保持其排序?

时间:2015-02-25 09:54:46

标签: java arrays algorithm sorting linked-list

如何将已排序的链接列表(L2)作为整个列表插入另一个已排序的链接列表(L1)并保持两者的排序?

方法头应为:void insertList(LinkedList L2)

例如:

L1 = 1 → 2 → 3 → 10
L2 = 4 → 5 → 6

调用方法后,L1列表应为:

1 → 2 → 3 → 4 → 5 → 6 → 10

怎么做?

1 个答案:

答案 0 :(得分:2)

您正在寻找merge sort的合并阶段。

只需将两者一起迭代,然后每次都将最小元素推送到结果列表,就可以在LinkedList中完成。

伪代码:

iter1 = list1.iterator()
iter2 = list2.iterator()
//before these commands make sure the lists are not empty:
curr1 = iter1.next(); 
curr2 = iter2.next();
List result = new LinkedList();
while curr1 != null && curr2 != null {
   if curr1 < curr2 { 
          result.add(curr1);
          curr1 = list1.next();
   } else { 
          result.add(curr2);
          curr2 = list2.next();
   }
}
while (curr1 != null) {
   result.add(curr1);
   curr1 = curr1.next();
}
while (curr2 != null) {
   result.add(curr2);
   curr2 = curr1.next();
}

小注意事项:对于链表,您可以优化它以就地运行并修改其中一个列表,而不是使用ListIterator界面和{{{3}}界面创建新列表(如果需要) {1}}方法。该算法非常相似,在插入有关调用额外add()的元素时需要格外小心。

我留给你修改算法来修改next()到位,因为一旦理解了上述算法,应该非常清楚如何做到这一点。