[算法][合并两个链表]有个地方的赋值看不懂,求助

具体题目在这里,leetcode.com/problems/merge-two-so...
简单说,就是两个链表,按顺序合并

我对于怎么遍历写next的值有点疑惑,所以参考了个一个leetcode上的回答。
代码如下:

/**
 * Definition for a singly-linked list.
 * class ListNode {
 *     public $val = 0;
 *     public $next = null;
 *     function __construct($val = 0, $next = null) {
 *         $this->val = $val;
 *         $this->next = $next;
 *     }
 * }
 */

    public function push_back($newElement)
    {
        //new 一个链表的类
        $newNode = new ListNode();
        //给这个链表的val赋值
        $newNode->val = $newElement;
        //给这个链表的next设为空,其实就是根据传进来的一个数字,将它转化成了链表的val+next样式
        $newNode->next = null;

        //如果是第一次传数据进来,$this->head是空的情况
        if ($this->head == null) {
            $this->head = $newNode;
        } 
        //不是第一次传数据进来,head有值的情况
        else {
            //首先把$this->head的值赋给temp,这样遍历的时候不影响已经形成的链表
            $temp = $this->head;
            //print_r($this);

            //遍历temp,发现next值为空时,跳出遍历,
            while ($temp->next != null) {
                $temp = $temp->next;
            }
            //把前面生成的,根据传进来的数据生成的链表实例赋值temp
            $temp->next = $newNode;

            //现在的问题是,temp被赋值了之后,为什么$this->head的值也会变
            //print_r($this);exit;
        }
    }

class Solution {

    /**
     * @param ListNode $list1
     * @param ListNode $list2
     * @return ListNode $list
     */
    function mergeTwoLists($list1, $list2) {
        $list = new LinkedList();

        while($list1 && $list2){
            if($list1->val < $list2->val){
                $list->push_back($list1->val);
                $list1 = $list1->next;
            }else{
                $list->push_back($list2->val);
                $list2 = $list2->next;           
            }

        }

        if(!$list1 && $list2){
            while($list2){
                $list->push_back($list2->val);
                $list2 = $list2->next;         
            }
        }

        if($list1 && !$list2){
            while($list1){
                $list->push_back($list1->val);
                $list1 = $list1->next;         
            }
        }

        return $list->head;

    }
}

我不明白的部分在这里

【算法】【合并两个链表】有个地方的赋值看不懂,求助

感觉是把$this->head的值赋给了$temp,
然后遍历$temp直到他的next为空,把new的listnode赋给这个空的next,
但为什么给$temp赋值,$this->head会同时也被赋值了呢?

打开注释,打出来的结果

【算法】【合并两个链表】有个地方的赋值看不懂,求助

非常基础,求助。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案
<?php

class Node {
    public $head;
}

$a = new Node();
$a->head = 123;
print_r($a);

$b = $a;
$b->head = 456;
print_r($a);

举个列子,上面这个 $b 就是一个引用类型, 它的值和$a是同一个地址,所以你改变了$b的head值,所以$a的就跟着一起变了。 php的变量类型分普通类型和引用类型, 对象就是引用类型。 我寻思这不是基本常识吗。。。

1年前 评论
Helen2022 (楼主) 1年前
讨论数量: 17

算法的问题,你需要画图才能解决。

你画一下你认为的图形,然后再看。

1年前 评论
Helen2022 (楼主) 1年前
JinBB (作者) 1年前
Helen2022 (楼主) 1年前
JinBB (作者) 1年前
JinBB (作者) 1年前
Mutoulee

没太看懂这个题,粗浅理解:

$a = [-2, 1, 2, 4];
$b = [-33, 1, 3, 4];
$c = array_merge_recursive($a, $b);
sort($c);
dd($c);

//输出:
array:8 [
  0 => -33
  1 => -2
  2 => 1
  3 => 1
  4 => 2
  5 => 3
  6 => 4
  7 => 4
]

可能我想的太简单了 :cry:

1年前 评论
Helen2022 (楼主) 1年前
Helen2022 (楼主) 1年前
Mutoulee (作者) 1年前
Luff

file

1年前 评论

因为next指向的是一个对象,对象是引用类型啊,所以你改变了next的值,所以head对应的也会跟着一起变

1年前 评论
Helen2022 (楼主) 1年前
Helen2022 (楼主) 1年前
Helen2022 (楼主) 1年前
<?php

class Node {
    public $head;
}

$a = new Node();
$a->head = 123;
print_r($a);

$b = $a;
$b->head = 456;
print_r($a);

举个列子,上面这个 $b 就是一个引用类型, 它的值和$a是同一个地址,所以你改变了$b的head值,所以$a的就跟着一起变了。 php的变量类型分普通类型和引用类型, 对象就是引用类型。 我寻思这不是基本常识吗。。。

1年前 评论
Helen2022 (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!