题目描述: 给定两个 非空 链表来表示两个非负整数。位数按照 逆序 方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入: (2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 0 -> 8
原因: 342 + 465 = 807
算法描述
从左往右依次遍历两个输入的List,对这两个List的Node对应加和,但是要注意的就是进位问题和这里的数字是反向的,注意进位判断,其实这个反向的条件对我们是有利的,因为这和我们平常加法算数是一致的,从低位到高位,这里只不过改成从左往右了,原理都是一样的。
还要注意输入链表的最后一个结点位置,我们用循环来遍历的时候就需要每一次都检查链表是不是最后一个结点,而且两个链表长度未必一样,注意空引用判断。
代码实现:
创建链表(节点类):
class ListNode {
public int val;
public ListNode next;
public ListNode(int i) {
this.val = i;
} public int val() {
return val;
}
}
实现的主要逻辑:
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode l4 = new ListNode(0);
ListNode l3 = new ListNode(0);
l4.next = l3;
while (l1 != null || l2 != null) {
int val1 = l1 == null ? 0 : l1.val;
int val2 = l2 == null ? 0 : l2.val;
// 创建新的结点
ListNode l5 = new ListNode(0);
// 进位
l5.val = (val1 + val2 + l3.val) / 10;
// 当前位
l3.val = (val1 + val2 + l3.val) % 10;
// 如果是最后一次循环,且最后一位为0,那么就要除去这个结点
if (l5.val == 0 && (l1 != null ? l1.next : null) == null && (l2 != null ? l2.next : null) == null) {
l3.next = null;
} else {
l3.next = l5;
l3 = l5;
}// 跳转指针
l1 = l1 == null ? null : l1.next;
l2 = l2 == null ? null : l2.next;
}
return l4.next;
}
测试代码:
输出逻辑:
public static void printList(ListNode l) {
while (l != null) {
System.out.print(l.val);
System.out.print("->");
l = l.next;
}
}
输入输出:
public static void main(String[] args) {
ListNode l1 = new ListNode(2);
ListNode l2 = new ListNode(4);
ListNode l3 = new ListNode(3);
l1.next = l2;
l2.next = l3;
l3.next = null;
ListNode l4 = new ListNode(5);
ListNode l5 = new ListNode(6);
ListNode l6 = new ListNode(4);
l4.next = l5;
l5.next = l6;
l6.next = null;
System.out.println("输入:"+"("+l1.val+"->"+l2.val+"->"+l3.val+")"+"+"+"("+l4.val +"->"+l5.val+"->"+l6.val+")");
System.out.print("输出:");
printList(addTwoNumbers(l1, l4));
}
完整版:
class ListNode {
public int val;
public ListNode next;
public ListNode(int i) {
this.val = i;
} public int val() {
return val;
}
}public class 两数相加 {
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode l4 = new ListNode(0);
ListNode l3 = new ListNode(0);
l4.next = l3;
while (l1 != null || l2 != null) {
int val1 = l1 == null ? 0 : l1.val;
int val2 = l2 == null ? 0 : l2.val;
// 创建新的结点
ListNode l5 = new ListNode(0);
// 进位
l5.val = (val1 + val2 + l3.val) / 10;
// 当前位
l3.val = (val1 + val2 + l3.val) % 10;
// 如果是最后一次循环,且最后一位为0,那么就要除去这个结点
if (l5.val == 0 && (l1 != null ? l1.next : null) == null && (l2 != null ? l2.next : null) == null) {
l3.next = null;
} else {
l3.next = l5;
l3 = l5;
}// 跳转指针
l1 = l1 == null ? null : l1.next;
l2 = l2 == null ? null : l2.next;
}
return l4.next;
} public static void printList(ListNode l) {
while (l != null) {
System.out.print(l.val);
System.out.print("->");
l = l.next;
}
} public static void main(String[] args) {
ListNode l1 = new ListNode(2);
ListNode l2 = new ListNode(4);
ListNode l3 = new ListNode(3);
l1.next = l2;
l2.next = l3;
l3.next = null;
ListNode l4 = new ListNode(5);
ListNode l5 = new ListNode(6);
ListNode l6 = new ListNode(4);
l4.next = l5;
l5.next = l6;
l6.next = null;
System.out.println("输入:"+"("+l1.val+"->"+l2.val+"->"+l3.val+")"+"+"+"("+l4.val +"->"+l5.val+"->"+l6.val+")");
System.out.print("输出:");
printList(addTwoNumbers(l1, l4));
}}
输出:
文章图片
【LeetCode||两数相加--给定两个 非空 链表来表示两个非负整数。位数按照 逆序 方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。】
推荐阅读
- 数据结构与算法|【算法】力扣第 266场周赛
- leetcode|今天开始记录自己的力扣之路
- Python|Python 每日一练 二分查找 搜索旋转排序数组 详解
- 【LeetCode】28.实现strstr() (KMP超详细讲解,sunday解法等五种方法,java实现)
- LeetCode-35-搜索插入位置-C语言
- leetcode python28.实现strStr()35. 搜索插入位置
- Leetcode Permutation I & II
- python|leetcode Longest Substring with At Most Two Distinct Characters 滑动窗口法
- LeetCode 28 Implement strStr() (C,C++,Java,Python)
- Python|Python Leetcode(665.非递减数列)