LeetCode刷题记录(一):两数相加

简介: LeetCode刷题记录(一):两数相加

两数相加

两数相加的题目如下图所示,也可以在LeetCode题目中找到此题。

网络异常,图片无法展示
|

注:关于LeetCode刷题记录,都是Java语言来解答,如果需要其他语言来编写会单独注明。

题目解析

两数相加,在题目的详细描述中,大概有着以下几点关键信息:

  1. 两个非空链表的相加。
  2. 两个非空链表的长度不一定相同。
  3. 每个链表中的节点数在范围 [1, 100] 内。
  4. 0 <= Node.val(节点值) <= 9
  5. 数据保证列表表示的数字不含前导零
  6. 链表中的节点均是数字,整个链表代表着一个逆序的数值。
  7. 链表的结构代码如下:
public class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
复制代码

比如链表A:2-4-3,表现值为:342;(暂且叫这个真实意图为表现值)

链表B:5-6-4,表现值为465;

两数相加的含义,也就是两个表现值为:342+465=807(也就是7-0-8).

我的解决过程

了解到以上的关键信息,再根据题目的描述,最先想到的就是通过循环链表元素的方式,将每个链表中的节点元素一一拿出来做相加操作。

在相加操作后,对大于等于10的情况进位处理(小学数学),并且将在下一次循环操作时进行加1操作。

网络异常,图片无法展示
|

因为链表中的数字相对表现值是逆序的,最后要得出的结果也是逆序的,所以是可以通过一个新链表对象依次插入值。也就不需要手动倒序之类的操作了。

开始编写

由于两个链表的长度不一定相同,所以循环时必须循环节点长度更长的链表。

因为ListNode链表对象中没有length长度属性,没办法通过这个条件进行循环。

但是根据条件3:每个链表中的节点数在范围[1, 100]内,可以通过使用具体数值循环操作。

完整的代码如下,是最笨的方法了。

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ListNode l3 = null;
    boolean flag = false;
    ListNode node1 = l1;
    ListNode node2 = l2;
    ListNode node3 = l3;
    for(int i = 0; i <= 100; i++){
        int val;
        int c = flag ? 1 : 0;
        if(node1 != null && node2 != null){
            val = add(node1.val, node2.val, c);
            flag = node1.val + node2.val + c >= 10;
        }else if(node1 == null){
            val = node2.val + c >= 10 ? node2.val + c - 10 : node2.val + c;
            flag = node2.val + c >= 10;
        }else {
            val = node1.val + c >= 10 ? node1.val + c - 10 : node1.val + c;
            flag = node1.val + c >= 10;
        }
        ListNode node = new ListNode(val);
        if(l3 == null){
            l3 = node;
            node3 = l3;
        }else{
            node3.next = node;
            node3 = node3.next;
        }
        if(node1 != null){
            node1 = node1.next;
        }
        if(node2 != null){
            node2 = node2.next;
        }
        if(node1 == null && node2 == null){
            if(flag){
                node3.next = new ListNode(1);
            }
            break;
        }
    }
    return l3;
}
private int add(int a, int b, int c){
    return a + b + c >= 10 ? a + b + c - 10 : a + b + c;
}


目录
相关文章
|
14天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
14天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
15天前
|
索引
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
|
15天前
|
算法
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
|
15天前
|
算法 容器
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
|
15天前
【LeetCode刷题】专题三:二分查找模板
【LeetCode刷题】专题三:二分查找模板
【LeetCode刷题】专题三:二分查找模板
|
15天前
【LeetCode刷题】前缀和解决问题:742.寻找数组的中心下标、238.除自身以外数组的乘积
【LeetCode刷题】前缀和解决问题:742.寻找数组的中心下标、238.除自身以外数组的乘积
|
15天前
【LeetCode刷题】二分查找:寻找旋转排序数组中的最小值、点名
【LeetCode刷题】二分查找:寻找旋转排序数组中的最小值、点名
|
15天前
【LeetCode刷题】滑动窗口思想解决:最大连续1的个数 III、将x减到0的最小操作数
【LeetCode刷题】滑动窗口思想解决:最大连续1的个数 III、将x减到0的最小操作数
|
15天前
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串