leetcode:2.add-two-number

169 阅读2分钟

题目描述

给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

解题思路

题设使用两个非空的逆序链表来表示数据,需要求和。最简单的思路肯定是将链表还原为数据,但存在溢出问题(参考大数相加问题)。不妨思考一下手算加法的过程,会发现是逆序相加的,联合本身给定数据为逆序链表,因此不存在位数对齐的忧虑,直接遍历链表相加(设置进位)即可

代码

JS版

/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function (l1, l2) {
  let head1 = l1,
    head2 = l2;       //保存head进行遍历,不修改原链表
  let result = new ListNode(0);     
  let temp = 0;      //设置进位标志
  let tempNode = result;     
  while (head1 || head2) {      
    if (head1) {
      temp += head1.val;
      head1 = head1.next;
    }
    if (head2) {
      temp += head2.val;
      head2 = head2.next;
    }
    let node = new ListNode(temp % 10);
    temp = temp / 10;
    tempNode.next = node;
    tempNode = node;
  }
  if(temp){
    tempNode.next = new ListNode(temp);
  }
  return result.next;
};

TS版

/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
interface node{
    val: number;
    next: ListNode
}
class ListNode implements node {
    constructor(val: number){
        this.val = val;
        this.next = null;
    }
    val: number; 
    next: node;
}
const addTwoNumbers = (l1:node, l2:node) : node => {
  let head1:node = l1,
    head2:node = l2;       //保存head进行遍历,不修改原链表
  let result:node = new ListNode(0);     
  let temp:number = 0;      //设置进位标志
  let tempNode:node = result;     
  while (head1 || head2) {      
    if (head1) {
      temp += head1.val;
      head1 = head1.next;
    }
    if (head2) {
      temp += head2.val;
      head2 = head2.next;
    }
    let node:node = new ListNode(temp % 10);
    temp = temp / 10;
    tempNode.next = node;
    tempNode = node;
  }
  if(temp){
    tempNode.next = new ListNode(temp);
  }
  return result.next;
};

PY版

#
# @lc app=leetcode id=2 lang=python3
#
# [2] Add Two Numbers
#

# @lc code=start
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        if l1 is None or l2 is None:
            return None
        carry_bit = 0
        result_reverse = ListNode(0)
        root = result_reverse
        while (l1 or l2):
            l1_value = l1.val if l1 else 0
            l2_value = l2.val if l2 else 0
            result_digit = l1_value + l2_value + carry_bit
            carry_bit = result_digit // 10
            result_digit = result_digit % 10
            temp_digit = ListNode(result_digit)
            result_reverse.next = temp_digit
            result_reverse = result_reverse.next
            l1 = l1.next if l1 else None
            l2 = l2.next if l2 else None
        if carry_bit > 0:
            result_reverse.next = ListNode(1)
        return root.next
# @lc code=end

时间复杂度

O(max(m,n))。 m, n分别表示l1,l2的长度,遍历一遍即可得出结果