链表中的数字相加

        不能简单认为将两条链表转变为整数后进行运算,然后将结果转变为链表。因为如果链表很长,这可能会导致整数溢出。

        在正常的两个整数加法运算时,我们是从低位开始,然后依次相加更高位的数字,所以不难想到我们需要将链表反转,方便我们从原链表的尾节点开始遍历到头节点。另外还要考虑运算时产生的进位。

    public ListNode addTwoNumbers(ListNode head1, ListNode head2) {
        // 反转输入链表,使得数字的相加从低位到高位进行
        head1 = reverseList(head1);
        head2 = reverseList(head2);

        // 调用 addReversed 方法进行相加操作
        ListNode reversedHead = addReversed(head1, head2);

        // 最后再次反转得到的链表,得到最终相加的结果
        return reverseList(reversedHead);
    }

    // 反转链表
    private ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode cur = head;

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

    // 将两个反转后的链表相加
    private ListNode addReversed(ListNode head1, ListNode head2) {
        ListNode dummy = new ListNode(0);
        ListNode sumNode = dummy;
        int carry = 0;

        // 循环遍历两个链表的每一位
        while (head1 != null || head2 != null) {
            // 获取当前位的值,若为空则取0
            int sum = (head1 == null ? 0 : head1.val)
                     + (head2 == null ? 0 : head2.val) + carry;

            // 计算是否有进位
            carry = sum >= 10 ? 1 : 0;

            // 若有进位,更新当前位的值
            sum = sum >= 10 ? sum - 10 : sum;

            // 创建新节点存储当前位的和,连接到相加后的链表
            ListNode newNode = new ListNode(sum);
            sumNode.next = newNode;
            sumNode = sumNode.next;

            // 移动到下一位
            head1 = head1 == null ? null : head1.next;
            head2 = head2 == null ? null : head2.next;
        }

        // 如果循环结束后仍有进位,增加一个新节点存储进位
        if (carry > 0) {
            sumNode.next = new ListNode(carry);
        }

        // 返回相加后的链表头节点
        return dummy.next;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不过是条河鱼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值