链表基本操作

2. 题目链接-来源:力扣(LeetCode) (中等)

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]

输出:[7,0,8]

解释:342 + 465 = 807.

####思路:
就是实现一个简单的整数加法,比一些常见的数字处理题要简单,简单之处在于:

  • 链表形式输出,不用考虑溢出问题。
  • 输入是逆序,输出也是逆序,与正常手工计算的顺序相同,很直观。

细节:留意一下进位即可,用一个变量carry记录是否进位

时间复杂度:O(n)
空间复杂度:O(n)

实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode sum = null;
ListNode curSum = sum;
ListNode curl1 = l1;
ListNode curl2 = l2;
int carry = 0;
while(curl1 != null || curl2 != null || carry != 0) {
int n1 = curl1 != null ? curl1.val : 0;
int n2 = curl2 != null ? curl2.val : 0;
int val = n1 + n2 + carry;
carry = val >= 10 ? 1 : 0;
val = val % 10;

if(sum != null) {
curSum.next = new ListNode(val, null);
curSum = curSum.next;
} else {
sum = new ListNode(val, null);
curSum = sum;
}


if(curl1 != null) {
curl1 = curl1.next;
}
if(curl2 != null) {
curl2 = curl2.next;
}
}

return sum;
}
}