2. Add Two Numbers
来源:互联网 发布:qq飞车猛禽数据 编辑:程序博客网 时间:2024/06/06 23:48
题目
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
翻译
翻译: 给你两个表示两个非负数字的链表。数字以相反的顺序存储,其节点包含单个数字。将这两个数字相加并将其作为一个链表返回。
输入: (2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 0 -> 8
先上我冗余度超高的代码,后面有时间再改
public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode l = new ListNode(0), p1 = l1, p2 = l2, r = l; int temp = 0; while (p1 != null && p2 != null) { ListNode t = new ListNode(0); int val = p1.val + p2.val + temp; if (val > 9) { t.val = val % 10; temp = 1; } else { t.val = val; temp = 0; } l.next = t; l = t; p1 = p1.next; p2 = p2.next; } while (temp == 1) { if (p1 != null) { int val = p1.val + temp; if (val > 9) { temp = 1; } else { temp = 0; } p1.val = val % 10; l.next = p1; l = p1; p1 = p1.next; } else if (p2 != null) { int val = p2.val + temp; if (val > 9) { temp = 1; } else { temp = 0; } p2.val = val % 10; l.next = p2; l = p2; p2 = p2.next; } else { l.next = new ListNode(1); temp = 0; } } if (p1 != null) { l.next = p1; } if (p2 != null) { l.next = p2; } return r.next; }
题目的可视化描述:
伪代码:
- 初始化当前节点为空链表头
- 初始化
carry 为0 . - 将
p 和q 分别初始化指向l1 和l2 的头部 - 遍历
l1 和l2 直到端点:- 将
x 设置为节点p 的值。如果p 到达l1 的末尾,设x 为0 。 - 将
y 设置为节点q 的 值。如果q 到达l2 的末尾,设y 为0 。 - 计算
sum=x+y+carry 。 - 更新
carry=sum/10 。 - 创建个新节点,值为
summod ,并让其成为当前节点的下一节点,推进当前节点。 - 推进
p 和q 。
- 将
- 检查是否有
carry=1 , 是就将一个值为1的新节点添加到链表结尾。 - 返回虚拟头的next节点
参考算法:
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;}
复杂度分析:
假设
时间复杂度:
空间复杂度:
阅读全文
1 0
- 2.Add Two Numbers
- 2.Add Two Numbers
- 2.Add Two Numbers
- 2.Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 2.Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 2.Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 两个高效的cp 命令用法!
- 【SDOI2008】Sandy的卡片 DP
- mysql 主键 外键
- OpenCV 3.1.0在VS 2013下配置
- 【STM32小案例 08 】STM32调用4*4矩阵键盘,未完待续
- 2. Add Two Numbers
- hdu 2553 N皇后问题
- NKOJ 3051 浇花 (差分数组/区间DP)
- 酷狗桌面歌词效果
- 动态获取div的高度 随着窗口变化而变化 window.resize
- 机器学习 第五周 总结 知识点
- 十大Intellij IDEA快捷键(转)
- 目标跟踪之CVPR_2017_Attentional Correlation Filter Network for Adaptive Visual Tracking
- Codeforeces868CQualification Rounds(位运算)