[算法][合并两个链表]有个地方的赋值看不懂,求助
具体题目在这里,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会同时也被赋值了呢?
打开注释,打出来的结果
非常基础,求助。
举个列子,上面这个 $b 就是一个引用类型, 它的值和$a是同一个地址,所以你改变了$b的head值,所以$a的就跟着一起变了。 php的变量类型分普通类型和引用类型, 对象就是引用类型。 我寻思这不是基本常识吗。。。