您的位置:首页 > 财经 > 金融 > LeetCode 2. 两数相加 --- 链表、模拟

LeetCode 2. 两数相加 --- 链表、模拟

2024/12/23 9:45:24 来源:https://blog.csdn.net/lph159/article/details/137545339  浏览:    关键词:LeetCode 2. 两数相加 --- 链表、模拟

目录

    • 1. 思路与算法
    • 2. 代码
    • 3. 复杂度分析

题目简述:给定两个非空的链表,表示两个非负整数,它们每位数字都是按照逆序方式存储的。要求将这两个数相加,并以相同形式返回一个表示和的链表。每个链表中的节点只能存储一位数字,并且除了数字 0 之外,这两个数都不会以 0 开头。

1. 思路与算法

使用迭代的方法来实现链表的相加。从两个链表的头节点开始,依次将对应位置的数字相加,并保留进位。在遍历完两个链表的所有节点之后,如果还存在进位,就需要在结果链表中追加一个节点来存储进位。

2. 代码

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {// 创建一个虚拟头节点,用于存储结果链表ListNode dummyHead = new ListNode(0);ListNode p = l1, q = l2, curr = dummyHead;int carry = 0;//进位while (p != null || q != null) {// 获取当前节点的值,如果链表已经遍历完成,则默认为 0int x = (p != null) ? p.val : 0;int y = (q != null) ? q.val : 0;// 计算当前节点的和,包括进位int sum = x + y + carry;// 更新进位carry = sum / 10;// 创建新节点,存储当前节点的值curr.next = new ListNode(sum % 10);// 将指针 curr 向后移动一位curr = curr.next;// 移动指针 p 和 q,准备下一轮循环if (p != null) p = p.next;if (q != null) q = q.next;}// 处理最后的进位,如果有进位则在结果链表的末尾添加一个节点if (carry > 0)curr.next = new ListNode(carry);// 返回结果链表的头节点return dummyHead.next;}

3. 复杂度分析

  • 时间复杂度:遍历两个链表一次,时间复杂度为 O(max(m, n)),其中 m 和 n 分别是两个链表的长度。
  • 空间复杂度:除了存储结果的链表以外,只需要常数级别的额外空间,因此空间复杂度为 O(1)。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com