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

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

两数相加

两数相加的题目如下图所示,也可以在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; } ```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ijiran

一杯咖啡太贵,一块糖就可以

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

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

打赏作者

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

抵扣说明:

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

余额充值