java - 如何在保持排序的同时将排序的链表插入另一个排序的链表?

标签 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

如何实现?

最佳答案

您正在寻找 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接口(interface)和 add() 方法。该算法非常相似,只是在插入元素时需要格外小心以调用额外的 next()

我留给您修改算法以就地修改 list,因为一旦理解了上述算法,应该非常清楚如何去做。

关于java - 如何在保持排序的同时将排序的链表插入另一个排序的链表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28715912/

相关文章:

java - 双向链表中给定节点之间的反向链表 - 算法

c# - 使用 C# 进行 selenium webdriver 测试

java - 删除相同出现的特定字符

javascript - 如何在 React.js 中对数据对象数组进行排序

c# - 检查一个实现的存在,对于 "string search method in database"

algorithm - 3d 空间中的三角形三角形交点

java - 将逗号分隔的字符串传递给存储过程中的 IN 子句

java - Java 中单个统一参数与特定参数 (>= 7)

arrays - 如何访问数组 NODE JS 中的对象

c - 从 C 中的 malloc 数组中删除元素