为什么头指针在覆盖当前头节点时会失去对链表的跟踪

Why does the head pointer lose track of the linkedlist when overwriting the current head node

比较:

public static ListNode mergeTwoLists(ListNode list1, ListNode list2)
    {
        ListNode dummy = new ListNode(-1);
        ListNode head = dummy;

        while (list1 != null && list2 != null)
        {
            if (list1.val < list2.val)
            {
                dummy.next = list1;
                list1 = list1.next;
            }
            else
            {
                dummy.next = list2;
                list2 = list2.next;
            }

            dummy = dummy.next;
        }
        if (list1 == null)
        {
            dummy.next = list2;
        }
        else if (list2 == null)
        {
            dummy.next = list1;
        }
        return head.next;
    }

收件人:

 public static ListNode mergeTwoLists(ListNode list1, ListNode list2)
        {
            ListNode dummy = new ListNode(-1);
            ListNode head = dummy;

        while (list1 != null && list2 != null)
        {
            if (list1.val < list2.val)
            {
                dummy = list1;
                list1 = list1.next;
            }
            else
            {
                dummy = list2;
                list2 = list2.next;
            }

            dummy = dummy.next;
        }
        if (list1 == null)
        {
            dummy.next = list2;
        }
        else if (list2 == null)
        {
            dummy.next = list1;
        }
        return head.next;
    }

head 指向虚拟 ListNode 的方式有何不同。

我的理解是不使用 dummy.next = list1 而只是让 dummy = list1,我们实际上是在重写 dummy 的当前值。然后当我们到达:

dummy = dummy.next;

Dummy 将等于 null。因此,当我们进入循环的下一次迭代时,我们会将 null 重新分配给 list1 中的任何节点。那么,当我们这样做时,为什么 head 无法跟踪 dummy 呢?是因为我们将 dummy 的第一个节点分配给不同的列表吗?

您只能通过为节点的属性赋值来改变列表,而不是通过为局部变量赋值。

就像 list1 = list1.next 不会 改变 list1,而只是将引用移动到该列表中的下一个节点,所以 dummy = list1也不会更改该列表。它只是设置一个节点的引用;该列表中没有任何变化。

所以在你的第二个版本中,dummy 开始作为对值为 -1 的节点的引用,但随后在循环的第一次迭代中 放弃 该节点,并引用 list1 中的另一个节点。因此,值为 -1 never 的节点将任何分配给它的 next 成员的东西都保留 null 直到函数执行结束。