剑指 Offer II 025. 链表中的两数相加

118 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

一、题目描述:

给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

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

 

示例1:

image.png

输入:l1 = [7,2,4,3], l2 = [5,6,4] 输出:[7,8,0,7] 示例2:

输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[8,0,7] 示例3:

输入:l1 = [0], l2 = [0] 输出:[0]  

提示:

链表的长度范围为 [1, 100] 0 <= node.val <= 9 输入数据保证链表代表的数字无前导 0  

进阶:如果输入链表不能修改该如何处理?换句话说,不能对列表中的节点进行翻转。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/lM…

二、思路分析:

注意考虑到整数有可能溢出 ,链表的长度页不相同。 将两个链表分别反转 反转之后的链表的头节点表示个位数,尾节点表示最高位;从两个链表的头节点开始相加,就相当于从整数的个位数开始相加 要注意进位,如果两个整数的个位数相加的和超过10,就会往十位数产生一个进位,在下一步做十位数相加时就要把这个进位考虑进去

三、AC 代码:


class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        l1=reverseList(l1);
        l2=reverseList(l2);
        ListNode newnode=addList(l1,l2);
        newnode=reverseList(newnode);
        return newnode;
    }
    public ListNode addList(ListNode l1,ListNode l2){
        ListNode dummy=new ListNode(0);
        ListNode sumnode=dummy;
        int count=0;
        while(l1!=null || l2!=null){
           
            int sum=(l1==null?0:l1.val)+(l2==null?0:l2.val)+count;
            count=sum>=10?1:0;
            sum=sum>=10?sum-10:sum;
            ListNode node=new ListNode(sum);
            sumnode.next=node;
            sumnode=sumnode.next;

            if(l1!=null) l1=l1.next;
            if(l2!=null) l2=l2.next;
        }
        if(count>0){
            sumnode.next=new ListNode(count);
        }
        return dummy.next;
    }

    public ListNode reverseList(ListNode head){
        ListNode pre=null;
        ListNode node=head;
        while(node!=null){
            ListNode temp=node.next;
            node.next=pre;
            pre=node;
            node=temp;
        }
        return pre;
    }
}

四、总结:

掘友们,解题不易,如果觉得有用就留下个赞或评论再走吧!谢啦~ 💐