zoukankan      html  css  js  c++  java
  • 剑指offer——合并两个排序的链表——对象、引用和赋值初接触

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

    先公布结果:

     1 /*
     2 public class ListNode {
     3     int val;
     4     ListNode next = null;
     5 
     6     ListNode(int val) {
     7         this.val = val;
     8     }
     9 }*/11 public class Solution {
    12     public ListNode Merge(ListNode list1,ListNode list2) {
    13         if (list1 == null) {//首先判断两个链表是否为空,若为空,则无需判断
    14             return list2;
    15         }
    16         if (list2 == null) {
    17             return list1;
    18         }
    19         ListNode head = new ListNode(-1);//构建最终链表
    20         ListNode cur = head;//构建当前操作节点的链表
    21         while (list1 != null && list2 != null) {
    22             if (list1.val < list2.val) {
    23                 cur.next = list1;
    24                 list1 = list1.next;
    25             } else {
    26                 cur.next = list2;
    27                 list2 = list2.next;
    28             }
    29             cur = cur.next;
    30         }
    31         while (list1 != null) {
    32             cur.next = list1;
    33             list1 = list1.next;
    34         }
    35         while (list2 != null) {
    36             cur.next = list2;
    37             list2 = list2.next;
    38         }
    39         return head.next;
    40     }
    41 }

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

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

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

    将其内容搬运过来:

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

     1 public class Yinyong {
     2     private int a;
     3     private int b;
     4     public void setA(int a) {
     5         this.a = a;
     6     }
     7     public void setB(int b) {
     8         this.b = b;
     9     }
    10 }

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

     1 public class YinyongTest {
     2     public static void main(String[] args) {
     3         Yinyong yy1 = new Yinyong();
     4         yy1.setA(1);
     5         yy1.setB(2);
     6         System.out.println(yy1);
     7         Yinyong yy2 = yy1;
     8         yy2.setA(-1);
     9         System.out.println(yy1);
    10         System.out.println(yy2);
    11     }
    12 }

    最后发现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. 对象和引用在存储空间上也是独立的,它们存储在不同的地方,对象一般存储在堆中,引用存储在速度更快的堆栈中。

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

     1 public class Solu {
     2     //基本参数传递
     3     public static void fun1(int m) {
     4         m = 100;
     5     }
     6     //参数为对象,不改变引用的值
     7     public static void fun2(StringBuffer s) {
     8         s.append("fun2");
     9     }
    10     //参数为对象,改变应用的值
    11     public static void fun3(StringBuffer s) {
    12         s = new StringBuffer("fun3");
    13     }
    14     
    15     public static void main(String[] args) {
    16         int i = 1;
    17         Solu s1 = new Solu();
    18         System.out.println(i);//1
    19         StringBuffer ss = new StringBuffer("main");
    20         System.out.println(ss.toString());//main        
    21         fun2(ss);        
    22         System.out.println(ss.toString());//mainfun2        
    23         fun3(ss);        
    24         System.out.println(ss.toString());//mainfun2
    25     }
    26 }

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

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

  • 相关阅读:
    MVC模式-----struts2框架(2)
    MVC模式-----struts2框架
    html的<h>标签
    jsp脚本元素
    LeetCode "Paint House"
    LeetCode "Longest Substring with At Most Two Distinct Characters"
    LeetCode "Graph Valid Tree"
    LeetCode "Shortest Word Distance"
    LeetCode "Verify Preorder Sequence in Binary Search Tree"
    LeetCode "Binary Tree Upside Down"
  • 原文地址:https://www.cnblogs.com/10081-AA/p/10664342.html
Copyright © 2011-2022 走看看