力扣 第二题 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

力扣 第二题 两数相加_第1张图片

输入:l1 = [2,4,3],l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

从左到右依次相加 进位即向右加1  

2+5 =7

4+6 =0 向右进位 1

3+4+1=8 

输出结果为 7 0 8 

先进来的数的数先进行相加,相加后大于10>进位取余数 

(注意有点 如果  l1[1,2,3] , l2 [1,2] 应该先将 l2赋值为[0 , 1,2]  因为从进位来看 右边的数为高位

这样就可以理解 赋值为什么从左边赋值) 代码如下:

 力扣 第二题 两数相加_第2张图片

没看懂?从头来理一下

给你两个 非空 的链表-----链表

链表是由俩部分构成 [date][pre]  数据域和指针域构成

[date] 数据域 :存放数据元素

[pre] 指针域 :存放下一个元素的地址

/**

 * Definition for singly-linked list.

 * public class ListNode {

 *     int val;

 *     ListNode next;

 *     ListNode() {}

 *     ListNode(int val) { this.val = val; }

 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }

 * }

 */

由注释可以知道

链表是 数据类型int,指针next  构成的[val][next]链表

当存放数据时调用方法LisNode(val)

cur.next = new ListNode(charr);

数据存放结束后,指针指向下一个元素

如 : next = next.next;  指针等于下一个的元素的地址

 cur = cur.next;

 看一下给出的数据

public ListNode addTwoNumbers(ListNode l1, ListNode l2) 

 我们可以得到 链表l1 和 链表l2  

需要我们返回 ListNode (一个链表)


1、创建链表,定义指针 per指向头节点(首地址)     定义cur 移动指针位置

ListNode per = new ListNode(0);
ListNode cur = per;

2、将俩个指针的数据相加 ,链表有俩个范围不好控制所以 使用while

要将俩个数据相加 , 判读链表是否为空 ,为空将要赋值0

既然考虑到要赋值 定义int型变量 如:x1

为空赋值0 不空赋值 val

while(l1!=null||l2!=null){
    int x1 = l1 == null ? 0 : l1.val;
    int x2 = l2 == null ? 0 : l2.val;

    int sum = x1 + x2;
}

3、将sum存入 链表 存入的值 sum 应该 0<=sum<10; 

因此需要一个数 控制进位

while(l1!=null||l2!=null){
    int charr = 0;
    int x1 = l1 == null ? 0 : l1.val;
    int x2 = l2 == null ? 0 : l2.val;
    int sum = x1 + x2 + charr;

    charr = sum / 10;
    sum = sum % 10;
    cur.next = new ListNode(sum);
}

4、移动指针

while(l1!=null||l2!=null){
    int charr = 0;
    int x1 = l1 == null ? 0 : l1.val;
    int x2 = l2 == null ? 0 : l2.val;
    int sum = x1 + x2 + charr;

    charr = sum / 10;
    sum = sum % 10;
    cur.next = new ListNode(sum);

     cur = cur.next;
     if(l1 != null)
         l1 = l1.next;
     if(l2 != null)
         l2 = l2.next;
}

如果最后一位的sum >9 需要进位 但是charr 在while 那就无法进位,l1和l2都空了

charr需要在while外面,如果最后charr = 1 我们移动到下一个指针 赋值1;

int charr = 0;
while(l1!=null||l2!=null){
    int x1 = l1 == null ? 0 : l1.val;
    int x2 = l2 == null ? 0 : l2.val;
    int sum = x1 + x2 + charr;

    charr = sum / 10;
    sum = sum % 10;
    cur.next = new ListNode(sum);

     cur = cur.next;
     if(l1 != null)
         l1 = l1.next;
     if(l2 != null)
         l2 = l2.next;
}
if(charr == 1){
   cur.next = new ListNode(charr);
}

完整代码如下

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode per = new ListNode(0);
        ListNode cur = per;
        int charr=0;
        while(l1!=null||l2!=null){
            int x1 = l1 == null ? 0 : l1.val;
            int x2 = l2 == null ? 0 : l2.val;
            int sum = x1 + x2 + charr;

            charr = sum / 10;
            sum = sum % 10;
            cur.next = new ListNode(sum);

            cur = cur.next;
            if(l1 != null)
                l1=l1.next;
            if(l2 != null)
                l2 = l2.next;
        }
        if(charr == 1){
            cur.next = new ListNode(charr);
        }
    return per.next;
    }
}

你可能感兴趣的:(算法入门练习,leetcode,链表,数据结构)