题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然,我们需要合成后的链表满足单调不减规则。

先公布结果:

 /*
public class ListNode {
int val;
ListNode next = null; ListNode(int val) {
this.val = val;
}
}*/ public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
if (list1 == null) {//首先判断两个链表是否为空,若为空,则无需判断
return list2;
}
if (list2 == null) {
return list1;
}
ListNode head = new ListNode(-1);//构建最终链表
ListNode cur = head;//构建当前操作节点的链表
while (list1 != null && list2 != null) {
if (list1.val < list2.val) {
cur.next = list1;
list1 = list1.next;
} else {
cur.next = list2;
list2 = list2.next;
}
cur = cur.next;
}
while (list1 != null) {
cur.next = list1;
list1 = list1.next;
}
while (list2 != null) {
cur.next = list2;
list2 = list2.next;
}
return head.next;
}
}

此处,自己本来的编程思路是和上述程序类似的,即非递归操作,但是没有采用head链表,只是采用了cur链表,结果最终输出的时候总是只输出最后部分的节点。

查阅相关内容才没明白,此处涉及到Java中的引用问题,其和赋值操作类似,但是引用是和对象互相关联又相互独立的存在。因为引用可以指向不同的对象,不同的引用也可以指向统一个对象,不管哪个引用操纵对象,对象的内容都会发生改变,并且只有一份。

参考:https://blog.csdn.net/yz930618/article/details/76278997/

将其内容搬运过来:

首先,我们便于说明和理解,首先定义一个简单的类:

 public class Yinyong {
private int a;
private int b;
public void setA(int a) {
this.a = a;
}
public void setB(int b) {
this.b = b;
}
}

之后对该类进行操作,观察其值的变化:

 public class YinyongTest {
public static void main(String[] args) {
Yinyong yy1 = new Yinyong();
yy1.setA(1);
yy1.setB(2);
System.out.println(yy1);
Yinyong yy2 = yy1;
yy2.setA(-1);
System.out.println(yy1);
System.out.println(yy2);
}
}

最后发现yy1和yy2的值都为a = -1;b = 2;

为此,我们进行分析:为什么改变yy2,yy1也会变化呢?

对于Yinyong yy1 = new Yinyong();语句,该语句执行的创建一个对象,包含了四个步骤:

1. 右边的'new Yinyong',表示以Yinyong类为模板,在对空间中创建一个Yinyong类对象;

2. '()' 表示在对象创建后,会立马调用Yinyong类的构造函数,由于没有给参数,所以会调用默认的无参结构;

3. 左边的‘Yinyong yy1’ 创建了一个Yinyong类的引用变量,也就是用来指向Yinyong对象的对象引用。此处类似于指针。

4. ‘=’ 这个等号操作符表示使对象引用yy1指向刚创建的Yinyong对象。

该语句包含了两个实体:一个时对象引用变量,一个是对象本身。

而且:

1. 一个对象引用可以指向0个或1个对象

2. 一个对象可以有N个引用指向它。

Java对象和引用的彼此独立:

1. 引用是可以改变的,它可以指向别的对象

2. 对象和引用在存储空间上也是独立的,它们存储在不同的地方,对象一般存储在堆中,引用存储在速度更快的堆栈中。

若非引用情况,则单一的参数传递不会导致原值的变化,而引用的参数传递,则需要看实际操作中是否改变了引用的指向,若未改变指向,则利用该引用操作对象时,原对象的值也变化,否则不变化。

 public class Solu {
//基本参数传递
public static void fun1(int m) {
m = 100;
}
//参数为对象,不改变引用的值
public static void fun2(StringBuffer s) {
s.append("fun2");
}
//参数为对象,改变应用的值
public static void fun3(StringBuffer s) {
s = new StringBuffer("fun3");
} public static void main(String[] args) {
int i = 1;
Solu s1 = new Solu();
System.out.println(i);//
StringBuffer ss = new StringBuffer("main");
System.out.println(ss.toString());//main
fun2(ss);
System.out.println(ss.toString());//mainfun2
fun3(ss);
System.out.println(ss.toString());//mainfun2
}
}

此处算是对引用和简单的赋值有了初步了解。

对于我们的题目,因为链表中式中存的是对象的引用,为此,我们需要一个head链表来进行最后结果存储,而采用一个cur链表来不断改变当前节点指向,并由此来得出排序后的链表。

剑指offer——合并两个排序的链表——对象、引用和赋值初接触的更多相关文章

  1. 剑指Offer——合并两个排序的链表

    题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 分析: 苦力活,使用两个指针分别指向未被合并的两个链表的首部,比较两个首部数值的大小,合并数值 ...

  2. python剑指offer 合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. # -*- coding:utf-8 -*- # class ListNode: # def _ ...

  3. 剑指Offer 合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.   思路: 用2个新节点,一个用来存放新链表的头节点,另一个用来移动.当p1,p2有一个到尾部的 ...

  4. 用js刷剑指offer(合并两个排序的链表)

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 牛客网链接 js代码 /*function ListNode(x){ this.val = x; ...

  5. 剑指OFFER——合并两个有序的链表

    输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 再做这道题就是想不起来书上怎么做的了,但是最近看STL里面全是这种基础的合并啊,比较啊.就算不会也看会了. ...

  6. 剑指offer--23.合并两个排序的链表

    时间限制:1秒 空间限制:32768K 热度指数:421239 本题知识点: 链表 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. class ...

  7. 剑指offer17 合并两个排序的链表

    错误代码: 最后两个if语句的目的是,最后一次迭代,两个链表中剩下的直接连接最后一次比较的数值,同时也是迭代停止的标志.虽然大if语句中比较大小得到的Node是正确的值,但每次迭代只要pHead2不为 ...

  8. 剑指Offer-16.合并两个排序的链表(C++/Java)

    题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 分析: 可以用一个新的节点,来去比较两个单调递增的链表当前节点的值,如果p1当前的值小于p2,则新 ...

  9. 《剑指offer》 合并两个排序的链表

    本题来自<剑指offer> 合并两个排序的链表 题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路: A:采用递归的方式(C++ C ...

随机推荐

  1. Linux性能监控分析命令(一)—vmstat命令详解

    一.vmstat介绍 语法格式: vmstat [-V] [-n] [-S unit] [delay [count]] -V prints version. -n causes the headers ...

  2. Django App(六) Customing Admin Form

    这一篇主要是呼应第二篇时留下来的一个问题,就是如何自定义默认app admin下的Form  1.绑定数据实体 通过第二篇的努力,已经完成了数据实体到数据库的映射,可以将界面的更改保存到数据库,我们建 ...

  3. IO流技术

    IO流常用基类 字节流的抽象基类:InputStream,OutputStream 字符流的抽象基类:Reader,Writer Writer类 子类:BufferedWriter,CharArray ...

  4. Github最简单实用的Git命令指南

    create a new repository on the command line   echo "# test" >> README.md git init gi ...

  5. linux基础之用户登录信息查看命令

    用户登录信息查看命令 1.who命令 同一个账号通过不同终端登录也属于不同的登录信息,这里不同的终端包含虚拟终端和模拟终端,因为一个用户通过一个终端登录属于一个session 基本介绍 打印当前系统上 ...

  6. python学习之路08——元组、集合

    一. 元组 1.概念 列表:是一种有序的集合 元组和列表的区别: ​ a.列表:[] 元组:() ​ b.列表中的元素可以进行增加和删除操作,但是,元组中的元素不能进行修改 ​ c.相同点:都是一种容 ...

  7. webstrom左侧项目栏不显示文件夹问题

    在使用webstrom的时候遇到问题: 打开项目,只显示package.json和webpack.config.js其他文件夹和文件都不显示 解决办法: 1.关闭webstrom当前项目 2.找到项目 ...

  8. 学习笔记TF033:实现ResNet

    ResNet(Residual Neural Network),微软研究院 Kaiming He等4名华人提出.通过Residual Unit训练152层深神经网络,ILSVRC 2015比赛冠军,3 ...

  9. Java类加载过程及static详解

    类从被加载到JVM中开始,到卸载为止,整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段. 其中类加载过程包括加载.验证.准备.解析和初始化五个阶段. 类加载器的任务就是根据一个类的 ...

  10. websocket 心跳重连

    websocket 的基本使用: var ws = new WebSocket(url); ws.onclose = function () { //something reconnect(); // ...