1. 题目描述
2. 解题思路
这道题目我最初的思路是先把两个链表分别转换为整数再进行相加运算,试了一下之后发现用int
会溢出,改用long
还是会溢出,显然官方不想我们用这个方法实现,遂放弃。那么只能使用最原始的加法运算方式,个位加个位,十位加十位,也还好该链表是以倒序的形式给出,因此只需要遍历一次链表就可以完成相加进位运算了,这里的重点步骤就是要考虑何时进位。
3. 代码实现
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int flag = 0;
ListNode pre = l2, ans = l2;
while (l1 != null && l2 != null) {
int sum = l1.val + l2.val + flag;
if (sum >= 10) {
l2.val = sum % 10;
flag = 1;
} else {
l2.val = sum;
flag = 0;
}
l1 = l1.next;
pre = l2;
l2 = l2.next;
}
if (l1 != null) {
pre.next = l1;
l2 = l1;
}
while (flag == 1 & l2 != null) {
int sum = l2.val + flag;
if (sum >= 10) {
l2.val = sum % 10;
flag = 1;
} else {
l2.val = sum;
flag = 0;
break;
}
pre = l2;
l2 = l2.next;
}
if (flag == 1)
pre.next = new ListNode(1);
return ans;
}
该算法的时间复杂度是O(n),n为两链表的最大长度;空间复杂度为O(1)。