Leetcode习题02 两数相加 详细代码执行流程

51 阅读2分钟

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

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

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

思路:两数求和,当两数位数相同时,直接求和即可;两个数的位数不同,把位数少的那一个链表的后继结点全部看做0,然后进行链表的相加;

执行流程:
1. 为相加后的链表创建头尾指针,其中头指针固定不动,尾指针用来插入节点
2. 设置初始的进位标志,初始为0
3. 开始循环,当有任何一个链表结点不为空的时候,说明还没有相加完毕,此时继续执行循环
    -判断当前的l1和l2节点是否为空,如果为空即为0,否则取当前值
    -计算求和和进位标志哦,需要注意次序不能颠倒
    -接下来判断如果头结点为空,
    -如果头结点不为空,使用尾插法插入节点
    -之后进行判断,如果l1和l2有一个不为空,则指向链表的下一个节点
4. 跳出循环后判断进位标志是否为1,如果为1创建一个新的节点加入即可。
    
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = null, tail = null; //head保存头节点
        int posion = 0;

        while(l1 !=null || l2 != null){
            int number1 = l1 != null ? l1.val : 0; //当l1不为null时将值取出来,否则取值为0
            int number2 = l2 != null ? l2.val : 0; //当l2不为null时将值取出来,否则取值为0
            int sum = number1 + number2 + posion;
            posion = sum / 10; //判断是否有进位
            int number = sum % 10; //当前要保存的元素
            if(head == null){
                head = tail = new ListNode(number);
            }else{
                tail.next = new ListNode(number);
                tail = tail.next;
            }
            if(l1 != null)
                l1 = l1.next;
            if(l2 != null)
                l2 = l2.next;
        }
        if(posion == 1){
            tail.next = new ListNode(1);
            tail = tail.next;
        }
        return head;
    }
}