力扣2. 两数相加

这篇博客介绍了如何使用链表来表示逆序的整数,并提供两种算法实现将两个这样的链表相加。算法的核心是遍历两个链表,逐位相加,同时处理进位问题。当链表长度不同时,通过补零使得两个链表相等长度,再进行相加。最后,检查是否有进位,若有则在链表末尾添加新的节点。
摘要由CSDN通过智能技术生成

题目

  • 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
  • 请你将两个数相加,并以相同形式返回一个表示和的链表。
  • 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

节点类

public class ListNode {
    int val;
    ListNode next;

    public ListNode() {
    }

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

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

思路:

  • 遍历两个链表,直接将他们的值相加,每次获得的值,即新链表的节点(大于10则取余后为新节点的val)。
  • 这里需要注意的是:两数之和 > 10,需要向前进1。这里定义了count,用于接收 两数之和 / 10,下次循环时,count > 0,说明本次和满
  • 10,进1了,sum 除了加两数之和,还要加count。
  • 当两个链表都为null时,判断count的值,是否>0,>0则说明最后一次两数相加,超过了10,把count放入next节点

具体代码实现

public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode p1 = l1;
        ListNode p2 = l2;
        //虚拟头节点
        ListNode head = new ListNode(0,null);
        ListNode pre = head;
        int count = 0;
        while(p1 != null || p2 != null){
            int sum = 0;
            if(p1 != null){
                sum += p1.val;
                p1 = p1.next;
            }
            if(p2 != null){
                sum += p2.val;
                p2 = p2.next;
            }
            if(count != 0){
                sum += count;
            }
            pre.next = new ListNode(sum % 10,null);
            pre = pre.next;
            //结束本次循环,开启下次循环,这里的count的值,还能在下次循环中体现么
            //比如第一次count=1,下次循环,count还是1吗.
            //答疑:count在while循环外部定义,所以它的值在while循环中一直存在,值有没有改变,看count有没有被重新赋值
            //第一次count=1,下次循环,count还是1,但一次循环结束后,它的值改变了。被赋值为 sum / 10;
            count = sum / 10;
        }
        if(count > 0){
            pre.next = new ListNode(count,null);
        }
        return head.next;
    }
}

思路2

  • 当链表长度不一时,用0去填充成一样长度,这样两值相加,结果不变。
  • 这里没有虚拟头节点,直接使用头节点去串起链表
public class Solution1 {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode p1 = l1;
        ListNode p2 = l2;
        ListNode head = null;
        ListNode pre = head;
        //
        int count = 0;
        //p1 p2都不为空
        while(p1 != null || p2 != null){
            //p1 p2为空,则他们值以0填充
            int n1,n2;
            if(p1== null){
                n1 = 0;
            }else{
                n1 = p1.val;
            }
            if(p2== null){
                n2 = 0;
            }else{
                n2 = p2.val;
            }
            //sum是相加后的值
            int sum = n1 + n2 + count;

            count = sum / 10;
            ListNode temp = new ListNode(sum % 10,null);
            //如果头节点为null,说明新生成的节点就是头节点
            if(head == null){
                pre = temp;
                head = pre;
            }else{
                //如果头节点不为null,只需要移动指针pre即可
                pre.next = temp;
                pre = pre.next;
            }
            if(p1 != null){
                p1 = p1.next;
            }
            if(p2 != null){
                p2 = p2.next;
            }
        }
        //最后判断count的值,如果大于0,则说明最后一次相加值>10,多一个节点
        if(count != 0){
            pre.next = new ListNode(count,null);
        }
        return head;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值