java 合并两个排序列表-如何链接两个节点

u7up0aaq  于 2023-08-02  发布在  Java
关注(0)|答案(2)|浏览(104)

我想问一个关于合并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?你能告诉我原因吗?- 谢谢-谢谢

lokaqttq

lokaqttq1#

当你使用ListNode currentEnd = output;时,你的代码会这样做:

output = new ListNode(0);
currentEnd = output;
// now both variables point to the same object

字符串
while循环的第一次迭代:

currentEnd.next = ...


这实际上与output.next = ...相同,因为你说的是output = currentEnd
但在循环结束时,您更改了currentEnd

currentEnd = currentEnd.next


这实际上与currentEnd = output.next相同。但是现在您为currentEnd分配了一个新值。这意味着从现在开始,outputcurrentEnd不再相同。output仍然和以前一样,因为你没有给output赋值。您只更改了currentEnd所指向的内容。
同样的,但从另一个Angular 来看:
请记住,您的变量 * outputcurrentEnd基本上只是指针。这些变量不存储任何数据,它们只存储数据的内存位置。你的代码是这样工作的:
new ListNode(0)将在内存中创建一个新对象。然后将该对象的内存位置分配给output(使用output =)。接下来,将完全相同的内存位置分配给currentEnd(使用currentEnd = output)。
现在内存中仍然有一个对象,但有两个变量指向它。
调用currentEnd.next =将转到currentEnd的内存位置(与循环的第一次迭代中的output相同),然后在此内存位置中设置next字段。
在循环结束时,执行currentEnd = currentEnd.next。这将得到currentEnd.next的内存位置,然后说currentEnd应该指向这个内存位置。这不会改变output指向的位置。(如果你想改变output指向的位置,只有一种方法:必须使用output = ...。)
我强烈建议你拿一张纸,把发生的事情按顺序画下来。那么事情应该会变得更加清晰。
(*)这只适用于Java中的Object,但不适用于基本类型。但是您的代码只使用对象,尽管这在这里并不重要。

u91tlkcl

u91tlkcl2#

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }*/
 

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode temp_node = new ListNode(0);
        ListNode current_node = temp_node ;

        while(l1 != null && l2 != null){
            if(l1.val <= l2.val){
                current_node.next=l1;
                l1=l1.next;
            }
            else{
                current_node.next=l2;
                l2=l2.next;
            }
            current_node = current_node.next;
        }
        if(l1 == null){
            current_node.next = l2; 
        }
        else if(l2 == null){
            current_node.next = l1;
        }
    //    current_node.next = l1!=null ? l1:l2;
       return temp_node.next;
    }
    
}

字符串

相关问题