我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/add-two-numbers/description/
题目描述:
知识点:链表
思路:在计算过程中实时地考虑进位的影响
这是两个非空的链表,且位数是按照逆序方式存储在这两个链表中的,因此,如果不考虑进位的影响,这是一题极其简单的题。正是由于要考虑进位的影响,给这道题增加了一点难度,但总体来说,只要我们考虑清除所有需要进位的情况,这道题也是可以迎刃而解的。
我们完全可以设立一个flag变量来记录当前位置的两个索引相加是否有进位,我们计算每一位结果的时候,都要把flag这个变量也给加进去。同时当一个链表到头了,即一个链表的元素全部被遍历了之后,如果另一个链表的元素还有剩余,我们也要继续考虑这个flag带给后续元素的持续影响,而不能简单地把另一个链表的剩余元素当做结果相应位的值。
由于需要同时遍历两个链表,所以我们算法的时间复杂度是O(n)级别的,其中n为两个链表中较长链表的长度值。因为整个操作过程只涉及指针级别的操作,所以空间复杂度是O(1)。
JAVA代码:
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode cur1 = l1;
ListNode cur2 = l2;
int flag = 0;
while(true) {
cur1.val = cur1.val + cur2.val + flag;
if(cur1.val >= 10) {
cur1.val -= 10;
flag = 1;
}else {
flag = 0;
}
if(cur1.next == null || cur2.next == null) {
break;
}
cur1 = cur1.next;
cur2 = cur2.next;
}
if(cur1.next == null && cur2.next == null && flag == 1) {
cur1.next = new ListNode(flag);
}else if(cur1.next == null && cur2.next != null) {
cur1.next = cur2.next;
cur1.next.val = flag + cur2.next.val;
ListNode cur = cur1.next;
while(cur.val >= 10) {
cur.val -= 10;
if(cur.next == null) {
cur.next = new ListNode(1);
}else {
cur.next.val += 1;
cur = cur.next;
}
}
}else if(cur1.next != null && cur2.next == null) {
cur1.next.val = flag + cur1.next.val;
ListNode cur = cur1.next;
while(cur.val >= 10) {
cur.val -= 10;
if(cur.next == null) {
cur.next = new ListNode(1);
}else {
cur.next.val += 1;
cur = cur.next;
}
}
}
return l1;
}
}
LeetCode解题报告: