(LeetCode)算法题目——Add Two Numbers
来源:互联网 发布:nginx 内网端口转发 编辑:程序博客网 时间:2024/06/07 04:58
给定两个非空的链表,表示两个非负整数。 数字以相反的顺序存储,每个节点包含一个数字。 添加两个数字并将其作为链表返回。
可以假设两个数字不包含任何前导零,除了数字0本身
举例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
分析:使用变量跟踪进位,并从包含最低有效数字的列表头开始模拟逐位数字和。
两个相加数字的可视化:342 + 465 =807。
每个节点包含单个数字,数字以相反的顺序存储。
就如在纸上相加两个数字一样,我们先将最低有效位的数字相加,即l1和l2的头部。由于每个数字都在0~9之间,所以两个数字相加可能会导致“溢出”(例如5+7=12)。这时,我们将当前数字设为2,并将carry=1移入下一次迭代。carry必须为0或者1,两位数最大的可能为9+9+1(进位)=19,carry不可能为2及以上的数字。
伪代码如下:
- 将当前节点初始化为返回列表的虚拟头。
- 初始化进位(carry)为0。
- 初始化p和q分别为l1和l2的头部。
- 循环l1和l2链表直到到达两者的结尾。
(1). 将x设置为节点p的值。 如果p已经达到l1的结尾,则设置为0。
(2).将y设置为节点q的值。 如果q已经达到l2的结尾,则设置为0。
(3).设sum=x+y+carry.
(4).更新carry=sum/10.
(5).创建一个新的值为(sum mod 10)的节点并且将其设置为当前节点的下一个节点,然后将当前节点推进到下一个节点。
(6).将p和q移到下一个节点。 - 检查进位carry是否为1,如果是1将新的节点加1。
- 返回虚拟头的下一个节点。
请注意,我们使用虚拟头来简化代码。 没有一个虚拟头,你将不得不编写额外的条件语句来初始化头的值。
//java代码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) { int x = (p != null) ? p.val : 0; int y = (q != null) ? q.val : 0; int sum = carry + x + y; carry = sum / 10; curr.next = new ListNode(sum % 10); curr = curr.next; if (p != null) p = p.next; if (q != null) q = q.next; } if (carry > 0) { curr.next = new ListNode(carry); } return dummyHead.next;}
/** * c++代码 * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */public class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode c1 = l1; ListNode c2 = l2; ListNode sentinel = new ListNode(0); ListNode d = sentinel; int sum = 0; while (c1 != null || c2 != null) { sum /= 10; if (c1 != null) { sum += c1.val; c1 = c1.next; } if (c2 != null) { sum += c2.val; c2 = c2.next; } d.next = new ListNode(sum % 10); d = d.next; } if (sum / 10 == 1) d.next = new ListNode(1); return sentinel.next; }}
如有问题,欢迎批评指正。
阅读全文
1 0
- (LeetCode)算法题目——Add Two Numbers
- leetcode—Add Two Numbers
- LeetCode算法题——Add Two Numbers
- LeetCode算法问题1 —— Add Two Numbers
- LeetCode题目之5 Add Two Numbers
- Leetcode题目分析 2. Add Two Numbers
- 47.leetcode题目2. Add Two Numbers
- LeetCode 作业题目:2. Add Two Numbers
- LeetCode题目:2. Add Two Numbers
- LeetCode —— Add Two Numbers
- LeetCode——Add Two Numbers
- LeetCode——Add Two Numbers
- leetcode 002 —— add two numbers
- LeetCode——Add Two Numbers
- LeetCode——Add Two Numbers
- #2 LeetCode——Add Two Numbers
- LeetCode——Add Two Numbers
- leetcode——Add Two Numbers
- 设计模式小结
- Spring Boot配置的第一个应用(如何启动)
- JavaScript之DOM操作
- 1-12tar归档 文件并在系统间复制文件
- 超实用git技巧之提交代码冲突或报error
- (LeetCode)算法题目——Add Two Numbers
- Lock的await/singal 和 Object的wait/notify 的区别
- Javaweb出错处理,myeclipse,Tomcat服务器选择错误
- 基于VxWorks的VxBus字符设备驱动
- Dubbo源码分析 Handler & Filter
- 使用if语句编写程序
- pythonweb练习(一)
- JavaScript之BOM操作
- A