LeetCode - 002_两数相加

题目描述

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

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

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

示例

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

思路

  1. 定义一个头结点,以及l1、l2、头结点的临时结点,定义一个变量存放进位
  2. 遍历两个临时链表,终止条件为两个临时链表的当前节点都为空
  3. 求出进位和两个链表当前位置的和,和10相除作为下一次进位,和10取余作为新节点,头结点临时结点下一个为此新节点
  4. 头结点、两个链表临时结点都取下一个,直到遍历结束
  5. 遍历结束,判断进位值是不是0,如果比0大,则表示还有进位,此进位作头结点临时结点的下一位
  6. 最后返回头结点的下一个

Code

@Data
public class ListNode {
    private int val;
    private ListNode next;

    public ListNode(int x) {
        val = x;
    }
}

public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        if (Objects.isNull(l1) && Objects.isNull(l2)) {
            return null;
        }
        ListNode head = new ListNode(0);
        ListNode l1Temp = l1;
        ListNode l2Temp = l2;
        ListNode headTemp = head;
        int num = 0;
        while (l1Temp != null || l2Temp != null) {
            int sum = num + (Objects.nonNull(l1Temp) ? l1Temp.getVal() : 0) + (Objects.nonNull(l2Temp) ? l2Temp.getVal() : 0);
            num = sum / 10;
            headTemp.setNext(new ListNode(sum % 10));
            headTemp = headTemp.getNext();
            l1Temp = Objects.nonNull(l1Temp) ? l1Temp.getNext() : null;
            l2Temp = Objects.nonNull(l2Temp) ? l2Temp.getNext() : null;
        }
        if (num > 0) {
            headTemp.setNext(new ListNode(num));
        }
        return head.getNext();
    }
}
posted @ 2021-03-16 23:30  芝諾de乌龟  阅读(49)  评论(0编辑  收藏  举报