LeetCode刷题之T2两数相加(中等)

这次讲解的题目是一个中等题,和链表的数据结构有关。接下来上题目:
在这里插入图片描述
链表的结构:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */

思路如下:
话不多说先看图!
在这里插入图片描述
由图可知我们进行342+456相加的时候是从head头开始相加,一直到尾部结束的,因为head的头所代表的的val值正好就是我们的最低位,所以我们解题的思路就是:两链表从头节点开始向后遍历,定义一个新的链表来保存当前位置上数的和,并保存进位的值,再下一次循环的时候将进位值加上,循环!循环的结束条件就是l1链表和l2链表的next域均为null!
思路图如下图!
在这里插入图片描述以上就是思路图,注意几点!
1.新定义的链表必须要有对它的引用(可以理解为指针)为什么呢?因为在给链表添加值的时候,我们会对它进行重新复制为next的操作,那么就是去了对头结点的引用了。
2.什么时候要对list进行新增下一个结点? 就是当当前对应的l1和l2有值得时候。
3.如果是1234+234这种会发生什么情况呢?假设l1是1234,l2是234,那么到千位的时候后出现1+null的情况,程序必然报错,所以我们进行的操作是如果位数不同,那么当前的位置上value值为0。

在这里插入图片描述接下来上代码!

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode res=new ListNode(0); //用来表示结果的链表
        ListNode point=res;//表示对res链表的引用,不然再遍历链表的时候会丢失引用
        int up=0; //表示进位的值 不满10则为0,满10+则为1
        while(l1!=null||l2!=null){ //循环开始 终止条件是next域均为null的情况
        //先判断如果当前位无数值  先将当前位补0  
        int x=l1==null?0:l1.val;
        int y=l2==null?0:l2.val;
        int sum=up+x+y;
        up=sum/10;  //如果当前大于10,那么up的值保存到下次相加的时候
        point.next=new ListNode(sum%10); //创建一个新的节点
        point=point.next;//移动到写一个节点
        //看l1和l2的下一个节点是否为空
        if(l1!=null){//只要当前的next不为null,就赋值到下一个
            l1=l1.next;
        }
        l2=(l2==null?l2:l2.next);
        }  
        //如果最高位相加造成了进位,那么up一定为1,因为两个是的next都为null,就跳出了!
        if(up==1){
            point.next=new ListNode(up);
        }
        //因为通过point指针来操纵的链表赋值,所以res的next就是需要返回的值!
        return res.next;
    }
}

以上就是本次题目的讲解,如果有不对的地方,欢迎大家指出,谢谢!(图画的不好,见谅,毕竟不会画图的程序员不是好程序员~)

猜你喜欢

转载自blog.csdn.net/Pzzzz_wwy/article/details/105519719