我想问一个关于合并2排序链表练习的问题:
合并两个有序链表并返回一个有序链表。该列表应通过将前两个列表的节点拼接在一起来制作。
Input: l1 = [1,2,4], l2 = [1,3,4]
Output: [1,1,2,3,4,4]
public class ListNode {
int val; // value of the node = val
ListNode next; // this is the pointer to the next node, which is connected to this current node
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
字符串
这是我的代码
//21. Merge Two Sorted Lists
public class merge2linkedlists {
public ListNode mergeTwoLists(ListNode l1, ListNode l2){
ListNode output = new ListNode(0); //head 0 - will remove later
ListNode currentEnd = new ListNode(0); //the current end node
output.next = currentEnd; // link head to the current end node
while(l1 != null && l2 != null) {
if(l1.val <= l2.val) {
currentEnd.next = l1; // link to the next node
l1 = l1.next; // move to the next node
}
else {
currentEnd.next = l2;
l2 = l2.next;
}
currentEnd = currentEnd.next; // change current end node
}//end while
if(l1 == null) {
currentEnd.next = l2;
}
else {
currentEnd.next = l1;
}
return output.next.next;
}
//main function here
public static void main(String[] args) {
new merge2linkedlists();
}
public merge2linkedlists() {
ListNode l1 = new ListNode(10); // head
l1.next = new ListNode(80);
l1.next.next = new ListNode(150);
l1.next.next.next = new ListNode(250);
ListNode l2 = new ListNode(60); // head
l2.next = new ListNode(100);
l2.next.next = new ListNode(300);
l2.next.next.next = new ListNode(800);
System.out.print("\nList l1 ");
l1.printLinkedList();
System.out.print("\nList l2 ");
l2.printLinkedList();
ListNode output = mergeTwoLists(l1,l2);
System.out.print("\nOutput ");
output.printLinkedList();
}
}
型
它运行正常。但我的问题是如果我把这两行
ListNode currentEnd = new ListNode(0); //the current end node
output.next = currentEnd; // link head to the current end node
型
由ListNode currentEnd = output;
和改变线return output.next.next;
是return output.next;
它仍然给出了正确的答案,我不明白,因为我不知道哪里的头的output
是链接到currentEnd
?你能告诉我原因吗?- 谢谢-谢谢
2条答案
按热度按时间lokaqttq1#
当你使用
ListNode currentEnd = output;
时,你的代码会这样做:字符串
while循环的第一次迭代:
型
这实际上与
output.next = ...
相同,因为你说的是output = currentEnd
。但在循环结束时,您更改了
currentEnd
:型
这实际上与
currentEnd = output.next
相同。但是现在您为currentEnd
分配了一个新值。这意味着从现在开始,output
和currentEnd
不再相同。output
仍然和以前一样,因为你没有给output赋值。您只更改了currentEnd
所指向的内容。同样的,但从另一个Angular 来看:
请记住,您的变量 *
output
和currentEnd
基本上只是指针。这些变量不存储任何数据,它们只存储数据的内存位置。你的代码是这样工作的:new ListNode(0)
将在内存中创建一个新对象。然后将该对象的内存位置分配给output
(使用output =
)。接下来,将完全相同的内存位置分配给currentEnd
(使用currentEnd = output
)。现在内存中仍然有一个对象,但有两个变量指向它。
调用
currentEnd.next =
将转到currentEnd
的内存位置(与循环的第一次迭代中的output
相同),然后在此内存位置中设置next
字段。在循环结束时,执行
currentEnd = currentEnd.next
。这将得到currentEnd.next
的内存位置,然后说currentEnd
应该指向这个内存位置。这不会改变output
指向的位置。(如果你想改变output
指向的位置,只有一种方法:必须使用output = ...
。)我强烈建议你拿一张纸,把发生的事情按顺序画下来。那么事情应该会变得更加清晰。
(*)这只适用于Java中的Object,但不适用于基本类型。但是您的代码只使用对象,尽管这在这里并不重要。
u91tlkcl2#
字符串