链接:https://leetcode-cn.com/problems/add-two-numbers/
解题思路
初始化:
- 初始化变量
ListNode ret
,作为返回的“和链表”头节点 - 初始化变量
ListNode cur
, 用来遍历“和链表” - 初始化变量
boolean isCarry
, 用来标记l1.val
与l2.val
的和是否大于等于 10
算法流程:
- 当
l1 != null && l2 != null
时,同时遍历l1
,l2
两个链表,构建“和链表” - 如果两个链表长度不一致,那么就会出现
l1
链表遍历完成l2
还未遍历结束;l2
链表遍历完成l1
还未遍历结束这两种情况:- 当
l1 != null
时,接着遍历l1
构建我们的“和链表” - 当
l2 != null
时,接着遍历l2
构建我们的“和链表”
- 当
- 最后,我们需要留意
isCarry
是否为真,如果为真,则代表最后还有进位,我们需要在“和链表”的尾部再添加一个值为 1 的节点
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode ret = null;
ListNode cur = null;
boolean isCarry = false;
while(l1 != null && l2 != null){
if(cur == null){
if(l1.val + l2.val >= 10){
isCarry = true;
}else {
isCarry = false;
}
ret = new ListNode((l1.val + l2.val) % 10);
cur = ret;
}else {
if(isCarry){
if(l1.val + l2.val + 1 >= 10){
isCarry = true;
}else {
isCarry = false;
}
cur.next = new ListNode((l1.val + l2.val + 1) % 10);
cur = cur.next;
}else {
if(l1.val + l2.val >= 10){
isCarry = true;
}else {
isCarry = false;
}
cur.next = new ListNode((l1.val + l2.val) % 10);
cur = cur.next;
}
}
l1 = l1.next;
l2 = l2.next;
}
while(l1 != null) {
if(isCarry){
if(l1.val + 1 >= 10){
isCarry = true;
}else {
isCarry = false;
}
cur.next = new ListNode((l1.val + 1) % 10);
cur = cur.next;
}else {
cur.next = new ListNode(l1.val);
cur = cur.next;
}
l1 = l1.next;
}
while(l2 != null) {
if(isCarry){
if(l2.val + 1 >= 10){
isCarry = true;
}else {
isCarry = false;
}
cur.next = new ListNode((l2.val + 1) % 10);
cur = cur.next;
}else {
cur.next = new ListNode(l2.val);
cur = cur.next;
}
l2 = l2.next;
}
if(isCarry){
cur.next = new ListNode(1);
}
return ret;
}
}
复杂度分析
- 时间复杂度:
我们只需要遍历 的长度即可,时间复杂度为
- 空间复杂度:
因为我们仅使用了有限的几个变量,所以额外空间复杂度为