给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。

Posted 小型骷髅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。相关的知识,希望对你有一定的参考价值。

力扣原题:两数相加。

 先贴代码:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) 
        ListNode l3 = new ListNode(-1); //定义一个新链表的头节点l3
        ListNode node3 = l3; //定义头节点的副本node3
        int ex = 0; //定义一个进位值ex

        while (l1 != null || l2 != null)
            ListNode nodeNext = new ListNode(-1); //定义node的后继节点
            node3.next = nodeNext;
            //将l1的val赋值给a
            int a = 0;
            if (l1 != null)
                a = l1.val;
            
            //将l2的val赋值给b
            int b = 0;
            if (l2 != null)
                b = l2.val;
            
            //将a和b的和赋值给c再加上进位值ex即为放入新链表的和
            int c = a + b + ex;
            //进行判断;若c >= 10 则产生进位值
            if (c >= 10)
                c =  c - 10;
                nodeNext.val = c;
                ex = 1;
            else 
                nodeNext.val = c;
                ex = 0;
            

            //以下各节点往后走一步
            node3 = node3.next;
            if (l1 != null) 
                l1 = l1.next;
            
            if (l2 != null) 
                l2 = l2.next;
            
        
        //若循环走完仍然有进位值,则说明最后一位值位10,所以再新建一个尾巴节点值位1
        if (ex == 1)
            ListNode cur = new ListNode(1);
            node3.next = cur;
        
        //返回头节点的next域
        return l3.next;
    

解题思路

在本题题目中给了我们两条链表,分别表示两个非负的整数,每位数字都是按照逆序的方式存储的。说明一条链表表示的整数正确读法应该是反过来读;例如链表:2->3->4 ,那它表示的数字应该为432。所以每一个链表第一个节点都代表着个位数。即在两数相加过程中,进位值都会进入next域,由此我便想到了,先创建一个新的链表,新链表每个节点都来储存其两条链表各节点相加的值:

然后就可以设定循环,要求链表1和链表2都走完时循环结束: 

 

 进入循环后新建一个节点来存储链表1和链表2节点的和:

 再将链表1和链表2的节点值相加:

注意:进入循环前已经设定了进位值ex为0,代表开始时没有进位。 

对节点和c进行判断,若其大于等于10说明产生了进位值,将ex赋为1,传入下一次循环中。

 之后将各节点往后走一步:

注意:为了避免空指针异常,链表1和链表2在遍历时需要判断其是否为null,若是则不能将其指向next域。 

等待循环走完后若此时进位值ex为0,说明原先两条链表最后一个节点相加值小于10,就不需要进位了;若ex值位1,说明已经产生进位,还需要再新建一个节点,其值为1,接到新链表的后面。此时就会有疑问:为什么新建节点val值为1?

在原题目中提示了Node.val值域是0到9,所以两节点之和最大也只是18,即若有进位值的话,它的值有且仅有1,所以新建节点值位1。 

PS:此题解仅为个人解法,可能并非最优解法,若有错误及疑问欢迎指出。

以上是关于给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。的主要内容,如果未能解决你的问题,请参考以下文章

两数相加

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

2. 两数相加

两数相加(链表)

LeetCode 链表两数相加

LeetCode 链表两数相加