ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【每日Leetcode-第二天】两数相加

2021-07-31 14:34:43  阅读:150  来源: 互联网

标签:ListNode 相加 next 链表 第二天 l2 l1 Leetcode 进位


题目描述

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

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

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

解题思路

题目要求将两个链表中的元素当做整数相加,返回包含结果的链表。 对两个链表进行同时遍历,将每一位相加,如果出现两个链表长度不一致的情况,那么在公共长度遍历完后,单独遍历较长的链表。最关键的问题是处理进位,在计算当前位置的和时要加上上一位的进位值,然后在下次循环开始前重新计算进位值。

四种情况

最高位进位是指链表长度的最大位数仍然需要向上进位,此时两个链表均已遍历完。

  1. 两个链表长度相等,并且最高位没有进位,如[1, 2, 3][4, 5, 6]这两组元素,和为[5, 7, 9]
  2. 两个链表长度相等,但是最高位有进位,如[1, 2, 3][4, 5, 7]这两组元素,和为[5, 7, 0, 1]
  3. 两个链表长度不相等,并且最高位没有进位,如[1, 2, 3][4, 5, 7, 1]这两组元素, 和为[5, 7, 0, 2]
  4. 两个链表长度不相等,并且最高位有进位,如[1, 2, 3][4, 5, 7, 9]这两组元素, 和为[5, 7, 0, 0, 1]

解题代码

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 空的头结点,用于串联链表
    ListNode resHead = new ListNode();
    // 保存最近一个被插入节点的前驱节点
    ListNode resPrev = resHead;
    // 最近一个被插入节点
    ListNode resNext = null;
    // 进位值
    int carry = 0;

    while (l1 != null || l2 != null) {
        int cur = 0;

        if (l1 != null && l2 != null) {            // 两个链表都不为空
            cur = l1.val + l2.val + carry;
            l1 = l1.next;
            l2 = l2.next;
        } else if (l1 != null) {                    // l1链表不为空,l2为空
            cur = l1.val + carry;
            l1 = l1.next;
        } else {                                    // l2链表不为空,l1为空
            cur = l2.val + carry;
            l2 = l2.next;
        }
        
        // 构造新的节点,并且插入链表中
        resNext = new ListNode(cur % 10);
        resPrev.next = resNext;
        resPrev = resNext;
        
        // 计算进位值
        carry = cur >= 10 ? 1 : 0;
    }
    
    // 处理最高位进位的情况
    if (carry == 1) {
        resPrev.next = new ListNode(1);
    }
    
    // resHead.next是第一个有效节点
    return resHead.next;
}

题目来源

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

标签:ListNode,相加,next,链表,第二天,l2,l1,Leetcode,进位
来源: https://www.cnblogs.com/fenfeng9/p/15084157.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有