leetcode 445. Add Two Numbers II(两数相加)

文章介绍了两种使用链表表示两个数字并相加的方法。第一种方法是先将链表逆序,然后逐位相加,处理进位。第二种方法利用栈实现类似逆序的效果,避免了链表的反转操作,但效率稍低。两种方法都确保最高位在链表的头节点。
摘要由CSDN通过智能技术生成

在这里插入图片描述

用链表代表2个数字,这2个数字相加的和用链表返回。
最高位在链表的head.

思路:

1.链表逆序

数字相加是从低位到高位的,然而链表中的数字是从高位指向低位。
所以涉及到链表的逆序。

逆序之后只需从head到tail把两个链表的数字相加,再用一个int表示进位。

链表的逆序:
最左边的数字逆序后应该是tail, 它的next指向null.
后面的数字每次都指向它的前一个数字。
所以用cur表示当前node, cur.next指向它前一个node,
然后cur移动到链表的下一节点,不停地把cur.next指向前一个node.

在把结果的数字一个一个地保存进结果的链表中时,
不断地把新数字指向前一个数字,就实现了从低位到高位保存的效果。

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode newHead = null;
        int carry = 0;

        l1 = reverseList(l1);
        l2 = reverseList(l2);

        while(l1 != null || l2 != null || carry > 0) {
            int num1 = (l1 != null ? l1.val : 0);
            int num2 = (l2 != null ? l2.val : 0);

            int sum = num1 + num2 + carry;
            int num = sum % 10;
            carry = sum / 10;

            ListNode cur = new ListNode(num);
            cur.next = newHead;
            newHead = cur;

            l1 = (l1 != null ? l1.next : null);
            l2 = (l2 != null ? l2.next : null);
        }
        return newHead;
    }

    ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;

        while(cur != null) {
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
}

在这里插入图片描述

2.Stack

如果不想用链表逆序,可以用Stack, 同样可以达到逆序的效果,但是速度不及上面的快。

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        Stack<Integer> st1 = new Stack<>();
        Stack<Integer> st2 = new Stack<>();
        ListNode res = null;
        int carry = 0;

        //相当于逆序链表
        while(l1 != null) {
            st1.push(l1.val);
            l1 = l1.next;
        }

        while(l2 != null) {
            st2.push(l2.val);
            l2 = l2.next;
        }

        while(!st1.empty() || !st2.empty() || carry > 0) {
            int num1 = st1.empty() ? 0 : st1.pop();
            int num2 = st2.empty() ? 0 : st2.pop();
            int sum = num1 + num2 + carry;
            int num = sum % 10;
            carry = sum / 10;

            ListNode cur = new ListNode(num);
            cur.next = res;
            res = cur;
        }

        return res;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值