试图弄清楚我的代码中缺少什么应该将链表2合并到链表1的末尾1.现在它只是获取第二个列表中的最后一个元素并返回它。
我试图使用的逻辑是沿着第一个列表(L1)向下走,然后将这些元素逐个添加到new_list,然后在我到达L1结束后对第二个列表(L2)执行相同操作。我也试图避免修改L1或L2,这就是我创建new_list的原因。
非常感谢任何帮助。
public NodeList(int item, NodeList next) {
this.item = item;
this.next = next;
}
public static NodeList merge(NodeList l1, NodeList l2) {
NodeList new_list = new NodeList(l1.item, l1.next);
NodeList new_list2 = new NodeList(l2.item, l2.next);
while (true) {
if (new_list.next == null) {
if (new_list2.next == null) {
return new_list;
}
else {
new_list.next = new NodeList(new_list2.next.item, new_list2.next.next);
new_list2 = new_list2.next;
}
}
else {
new_list.next = new NodeList(new_list.next.item, new_list.next.next);
new_list = new_list.next;
}
}
}
答案 0 :(得分:2)
您需要保留对列表中第一个节点的引用,这是您不需要的。在下面的示例中,我还将循环分解为具有预定终止条件的两个循环,因为这在逻辑上是您要尝试的。请注意,我从不复制对现有列表元素的引用,因为您提到过您永远不想修改它们。但我确实增加了对输入的本地引用:
public static NodeList merge(NodeList l1, NodeList l2) {
NodeList new_head = new NodeList(0, null);
NodeList new_node = new_head;
for(; l1 != null; l1 = l1.next) {
new_node.next = new NodeList(l1.item, null);
new_node = new_node.next;
}
for(; l2 != null; l2 = l2.next) {
new_node.next = new NodeList(l2.item, null);
new_node = new_node.next;
}
return new_head.next;
}
正如您所看到的,这有很多代码重复,因此很容易推广到任意数量的列表:
public static NodeList merge(NodeList... l) {
NodeList new_head = new NodeList(0, null);
NodeList new_node = new_head;
for(NodeList ln in l) {
for(; ln != null; ln = ln.next) {
new_node.next = new NodeList(ln.item, null);
new_node = new_node.next;
}
}
return new_head.next;
}