题目
给你两个非空 的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0开头。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
链接
https://leetcode-cn.com/problems/add-two-numbers
代码
/**
* 两数相加
*
* 输入:l1 = [2,4,3], l2 = [5,6,4]
* 输出:[7,0,8]
* 解释:342 + 465 = 807
*/
@Test
public void test2() {
// 创建两个链表 // 第一个链表: 2-> 4 -> 3 (在做加法运算代表的是342) ListNode l1 = new ListNode(3);
// 这是第一个链表的第一个节点(不能用这个节点去往下加数据)
// 必须有一个指针去往第一个节点上去加数据 ListNode p = l1;
// 这个指针节点会从链表的第一个节点一直往下走(直至最后一个节点) p.next = new ListNode(4);
ListNode l1 = new ListNode(3);
ListNode p = l1;
p.next = new ListNode(4);
p = p.next;
p.next = new ListNode(2);
p = p.next;
// 第二个链表 ListNode l2 = new ListNode(4);
ListNode l2 = new ListNode(4);
ListNode q = l2;
q.next = new ListNode(6);
q = q.next;
q.next = new ListNode(5);
ListNode re = addTwoNumbers2(l1, l2);
while (re != null) {
System.out.println(re.val);
re = re.next;
}
}
public static class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
public static ListNode addTwoNumbers2(ListNode l1, ListNode l2) {
// while (l1 != null) {
// System.out.println("===" + l1.val);
// l1 = l1.next;
// }
ListNode dummyHead = new ListNode(0);
ListNode p = l1, q = l2, curr = dummyHead;
//过10进位
int carry = 0;
while (p != null || q != null) {
int 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.next;
if (p != null) p = p.next;
if (q != null) q = q.next;
}
if (carry > 0) {
curr.next = new ListNode(carry);
}
return dummyHead.next;
}
知识点
涉及题目所给链表概念及定义链表
注意点
因逆序储存因此不同长度补0在左侧 例:0099