我正在研究"合并两个已排序的链接列表",但看起来我的头部尚未正确更新。
为了解决这个问题,我尝试了.val,但它在while循环中无法正常工作。
然后,有线的事情是,当我尝试.next时,它的工作原理。我完全糊涂了。 我把两个代码放在下面(工作的和错的),这样你就能看到我做了什么。
有人可以解释为什么第一个不起作用吗?
错误之一:
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/**
* @param ListNode l1 is the head of the linked list
* @param ListNode l2 is the head of the linked list
* @return: ListNode head of linked list
*/
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null)
return l2;
else if (l2 == null)
return l1;
ListNode result = new ListNode(5);
ListNode head = result;
while (l1 != null && l2 != null){
if (l1.val < l2.val){
result = l1;
l1 = l1.next;
}
else{
result = l2;
l2 = l2.next;
}
result = result.next;
}
if (l1 == null){
result = l2;
}
else{
result = l1;
}
return head;
}
}
工作一:
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null)
return l2;
else if (l2 == null)
return l1;
ListNode result = new ListNode(5);
ListNode head = result;
while (l1 != null && l2 != null){
if (l1.val < l2.val){
result.next = l1;
l1 = l1.next;
}
else{
result.next = l2;
l2 = l2.next;
}
result = result.next;
}
if (l1 == null){
result.next = l2;
}
else{
result.next = l1;
}
return head.next;
}
唯一的区别是我在第二个中加了.next。
谢谢!
答案 0 :(得分:1)
代码使用虚拟节点,以便在合并之后,dummy_node.next将最终指向合并列表。这简化了代码,因此它不必有条件地处理最初为空的合并列表。 (在C或C ++中,可以使用指向节点的指针而不是虚节点,但java没有等效的。)代码通过将result和head都设置为虚拟节点的引用开始,然后进行结果列表合并。工作代码返回head.next,这是原始的dummy_node.next。非工作代码返回head,它是对虚拟节点的引用,而不是对合并列表的引用。