leetcode第二题:两数相加

84 阅读2分钟

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

题目描述

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

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

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

输入: l1 = [2,4,3], l2 = [5,6,4]
输出: [7,0,8]
解释: 342 + 465 = 807.

输入: l1 = [0], l2 = [0]
输出: [0]

输入: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出: [8,9,9,9,0,0,0,1]

思路

两数相加这个题目,是一个比较中等难度的题目,也是大家一开始会碰到的前面几个题目,它的思路是,通过传入两个链表,首先创建一个链表,初始值为0,用来记录当前节点,并用于结果的返回,然后开始进行遍历链表,通过遍历,将这两个链表每个节点的数字都取出,进行相加,并处理进位。其中需要考虑到链表长度可能不一致,再较短的链表前面需要进行补0,保持两个链表对齐,再进行计算会好一点。

代码

public ListNode addTwo(ListNode node1, ListNode node2) {
  //创建一个临时链表,用来返回结果,初始值为0
  ListNode pre = new ListNode(0);
  //获取当前列表,这时初始值是0
  ListNode cur = pre;
  //判断是否有进位
  int carry = 0;
  //判断是不是遍历完
  while(node1 != null || node2 != null) {
    //为空的时候补0
    int x = node1 == null ? 0 : node1.val;
    int y = node2 == null ? 0 : node2.val;
    //处理结果相加
    int sum = x + y + carry;
    //判断是否进位
    carry = sum / 10;
    //拿到余数
    sum = sum % 10;
    //赋值
    cur.next = new ListNode(sum);
    //后移结果链表
    cur = cur.next;
    //后移链表
    if(node1 != null)
      node1 = node1.next;
    //后移链表
    if(node2 != null)
      node2 = node2.next;
  }
  //处理进位
  if(carry == 1) {
    cur.next = new ListNode(carry);
  }
  //返回结果
  return pre.next;
}

总结

两数相加,是一个中等难度的算法,一开始看到这种类型的题目,懵懵的,但实际上在读懂之后,进行处理,先想好思路,再逐步去验证,会发现其实很容易就理解了。其中主要的难点在于,怎么合适的处理好进位,还有补齐长度的时候会有点懵。总体来说,还是很好理解的一个题目