链接: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;}}
复杂度分析
- 时间复杂度:
我们只需要遍历 的长度即可,时间复杂度为
- 空间复杂度:
因为我们仅使用了有限的几个变量,所以额外空间复杂度为
