2.两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

一、创建一个新的链表l3来保存内容,从l1和l2的第一个节点开始依次遍历

注意:①初始化p,q分别指向l1,l2的头部,使得方法执行完后不改变l1,l2的内容(不要使用l1 = l1.next)

   ②两个链表长度不确定,当p = null || q = null 时,取这个节点的值为0(这样可以把多种情况综合起来,减少代码量)

   ③表达式   a?b:c的使用

时间复杂度:O(max(m, n)),假设 m 和 n 分别表示 l1 和 l2 的长度,上面的算法最多重复 max(m, n) 次

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) { val = x; }
 7  */
8 class Solution { 9 public ListNode addTwoNumbers(ListNode l1, ListNode l2) { 10 ListNode l3 = new ListNode(0); 11 ListNode p = l1,q = l2,curr = l3; 12 int plus = 0; 13 14 while(p != null || q != null){ 15 int x = (p != null) ? p.val : 0; 16 int y = (q != null) ? q.val : 0; 17 int sum = x + y + plus; 18 curr.next = new ListNode(sum % 10); 19 plus = sum / 10; 20 if(p != null) p = p.next; 21 if(q != null) q = q.next; 22 curr = curr.next; 23 24 } 25 if(plus != 0) 26 curr.next = new ListNode(plus); 27 return l3.next; 28 } 29 } 30 31

④java中对象引用放在栈中,对象的实例放于堆中,一个对象要是只声明不赋值,则只会在内存的栈区创建引用,堆中并无此引用的指向。

在Java中,null值表示引用不指向任何对象。

比如下面的代码是错误的示范

小技巧:对于链表问题,返回结果为头结点时,通常需要先初始化一个预先指针 pre,该指针的下一个节点指向真正的头结点head。使用预先指针的目的在于链表初始化时无可用节点值,而且链表构造过程需要指针移动,进而会导致头指针丢失,无法返回结果。

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode l3 = null;
        ListNode p = l1,q = l2,curr = l3;//相当于l3,curr只声明,不指向任何对象,所以在后面改变curr的内容时,对l3没有影响,仍然是null
        int plus = 0;

        while(p != null || q != null){
            int x = (p != null) ? p.val : 0;
            int y = (q != null) ? q.val : 0;
            int sum = x + y + plus;
            curr = new ListNode(sum % 10);
            plus = sum / 10;
            if(p != null) p = p.next;
            if(q != null) q = q.next;
            curr = curr.next;
           
        }
        if(plus != 0)
            curr = new ListNode(plus);
        return l3;
    }
}        

Integer a = null;
Integer b = a;
b = 30;
System.out.println(a);//仍然是null,a和b并没有指向同一个对象

 

posted @ 2019-08-05 16:30  开心的茄子炒西红柿  阅读(99)  评论(0)    收藏  举报