LeetCode002——两数相加

我的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解题报告:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,Leetcode 2 "两数相加"是一个涉及链表的问题。该问题给定了两个非负整数,每个整数的每一位都是按照逆序的方式存储在链表中。我们需要将这两个链表相加,并返回一个新的链表作为结果。 具体解题思路可以使用迭代法或递归法来解决。迭代法的伪代码如下所示: ``` 初始化一个哑节点 dummy 和一个进位 carry,同时把两个链表的头节点分别赋值给 p 和 q 遍历链表,直到 p 和 q 都为 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 把新节点连接到结果链表的尾部 更新 p 和 q 分别为 p.next 和 q.next 如果最后还有进位 carry,则创建一个新节点 node,节点的值为 carry,并连接到结果链表的尾部 返回结果链表的头节点 dummy.next ``` 递归法的伪代码如下所示: ``` 定义一个辅助函数 addTwoNumbersHelper,输入为两个链表的头节点 p 和 q,以及进位 carry 如果 p 和 q 都为 None 且 进位 carry 为 0,则返回 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 设置新节点的下一个节点为递归调用 addTwoNumbersHelper(p.next, q.next, carry) 返回新节点 返回 addTwoNumbersHelper(p, q, 0) 的结果 以上是解决 Leetcode 2 "两数相加"问题的两种方法。如果你还有其他相关问题,请
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值