题目地址:
https://leetcode.com/problems/add-two-numbers-ii/
给定两个链表,分别表示两个十进制整数,求它们的和,并返回和的链表表示。
思路是先将两个链表翻转,然后模拟手工相加两个整数的方法加起来,再把结果翻转回来。代码如下:
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0), prev = dummy;
l1 = reverse(l1);
l2 = reverse(l2);
int cur = 0;
while (l1 != null || l2 != null) {
if (l1 != null) {
cur += l1.val;
l1 = l1.next;
}
if (l2 != null) {
cur += l2.val;
l2 = l2.next;
}
prev.next = new ListNode(cur % 10);
prev = prev.next;
// cur / 10等于进位
cur /= 10;
}
// 如果进位等于1,说明最高位有进位,需要加上去
if (cur == 1) {
prev.next = new ListNode(1);
}
// 返回之前再翻转一次
return reverse(dummy.next);
}
private ListNode reverse(ListNode head) {
ListNode prev = null;
while (head != null) {
ListNode tmp = head.next;
head.next = prev;
prev = head;
head = tmp;
}
return prev;
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。