首页 / 算法 / LeetCode 算法2.两数相加
LeetCode 算法2.两数相加
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了LeetCode 算法2.两数相加,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2774字,纯文字阅读大概需要4分钟。
内容图文
![LeetCode 算法2.两数相加](/upload/InfoBanner/zyjiaocheng/719/b9cb2cdb512046268ade93c7d92ed645.jpg)
LeetCode 算法2.两数相加
问题
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
自解
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode root = new ListNode(0);
ListNode cursor = root;
int c = 0;
if (l1 != null && l2 != null) {
root.val = l1.val + l2.val;
if (root.val >= 10) {
c = 1;
root.val = root.val % 10;
} else
c = 0;
l1 = l1.next;
l2 = l2.next;
}
while (l1 != null && l2 != null)
{
ListNode temp = new ListNode(0);
temp.val = l1.val + l2.val + c;
if (temp.val >= 10) {
c = 1;
temp.val = temp.val % 10;
} else
c = 0;
cursor.next = temp;
cursor = temp;
l1 = l1.next;
l2 = l2.next;
}
while (l1 != null) {
ListNode temp = new ListNode(c+l1.val);
if (temp.val >= 10) {
c = 1;
temp.val = temp.val % 10;
} else
c = 0;
cursor.next = temp;
cursor = temp;
l1 = l1.next;
}
while (l2 != null) {
ListNode temp = new ListNode(c+l2.val);
if (temp.val >= 10) {
c = 1;
temp.val = temp.val % 10;
} else
c = 0;
cursor.next = temp;
cursor = temp;
l2 = l2.next;
}
if (c != 0)
cursor.next = new ListNode(1);
return root;
}
}
结果
其他解法
思路
- 将两个链表看成是相同长度的进行遍历,如果一个链表较短则在前面补 00,比如 987 + 23 = 987 + 023 = 1010
- 每一位计算的同时需要考虑上一位的进位问题,而当前位计算结束后同样需要更新进位值
- 如果两个链表全部遍历完毕后,进位值为 11,则在新链表最前方添加节点 11
- 小技巧:对于链表问题,返回结果为头结点时,通常需要先初始化一个预先指针 pre,该指针的下一个节点指向真正的头结点head。
- 使用预先指针的目的在于链表初始化时无可用节点值,而且链表构造过程需要指针移动,进而会导致头指针丢失,无法返回结果。
作者:guanpengchn
链接:https://leetcode-cn.com/problems/add-two-numbers/solution/hua-jie-suan-fa-2-liang-shu-xiang-jia-by-guanpengc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode pre = new ListNode(0);
ListNode cur = pre;
int carry = 0;
while(l1 != null || l2 != null) {
int x = l1 == null ? 0 : l1.val;
int y = l2 == null ? 0 : l2.val;
int sum = x + y + carry;
carry = sum / 10;
sum = sum % 10;
cur.next = new ListNode(sum);
cur = cur.next;
if(l1 != null)
l1 = l1.next;
if(l2 != null)
l2 = l2.next;
}
if(carry == 1) {
cur.next = new ListNode(carry);
}
return pre.next;
}
}
结果
内容总结
以上是互联网集市为您收集整理的LeetCode 算法2.两数相加全部内容,希望文章能够帮你解决LeetCode 算法2.两数相加所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。