Leetcode之2-两数相加(Add Two Numbers)

前言

个人网站

公众号: 北京程序猿, 网站 : https://yaml.vip

算法题

题干

给出两个 非空 的链表用来表示两个非负的整数。
其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字0之外,这两个数都不会以0开头。

示例

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

Java代码

public class ListNode {

    public int val;
    public ListNode next;

    public ListNode(int x) {
    val = x;
    }
}
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    if (l1 == null) {
        return l2;
    }
    if (l2 == null) {
        return l1;
    }
    ListNode root = new ListNode(0);
    ListNode cursor = root;
    int divided = 0;
    int cursorOneVal, cursorTwoVal;
    while (l1 != null || l2 != null) {
        cursorOneVal = l1 == null ? 0 : l1.val;
        cursorTwoVal = l2 == null ? 0 : l2.val;
        int nodeValSum = cursorOneVal + cursorTwoVal + divided;
        divided = nodeValSum / 10;
        ListNode node = new ListNode(nodeValSum % 10);
        cursor.next = node;
        cursor = cursor.next;
        l1 = l1 != null ? l1.next : null;
        l2 = l2 != null ? l2.next : null;
    }
    if (divided != 0) {
        ListNode last = new ListNode(divided);
        cursor.next = last;
    }
    return root.next;
    }

代码解析

  1. 第2-7行代码主要是针对特殊的case做处理。
  2. 第9行代码cursor为新链表指针。
  3. 第10行代码表示每次两链表元素做和除以10之后结果。
  4. 第23-25行代码表示,如果divided值不为0, 说明最后一个元素做和之后比10大, 需要将divided值放在最后一个节点。

总结

  1. 虽然这道算法题中等难度, 但算是比较简单, 重点是代码当中divided变量及最后节点的处理。

本文著作权归作者所有。

商业转载请联系作者获得授权,非商业转载请于文首标明作者姓名,保持文章完整性,并附上出处和文章链接!未按规范转载者,作者保留追究相应责任的权利!

作者:北京程序猿

链接:https://yaml.vip/2019/03/28/Leetcode%E4%B9%8B2-%E4%B8%A4%E6%95%B0%E7%9B%B8%E5%8A%A0/

    原文作者:北京程序猿
    原文地址: https://www.jianshu.com/p/4470a6897cf0
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞