题目描述
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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的长度,遍历一遍即可得出结果