描述:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
知识准备
首先是链表知识准备,本地练习链表的插入和遍历输出
链表结构的定义(按题目上结构定义)
// Definition for singly-linked list. 单链表
public 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 insertValue(ListNode headNode,int[] nums) {
//头结点为空
if (headNode == null) {
headNode = new ListNode(nums[0]);
}else {
//移动节点
ListNode listNode = headNode ;
}
//移动节点
ListNode listNode = headNode ;
for (int i = 1; i < nums.length; i++) {
//插值
ListNode listNode1 = new ListNode(nums[i]);
//连接下个节点
listNode.next = listNode1;
//指针移到末尾
listNode = listNode.next;
}
return headNode;
}
链表的遍历
public static void outValue(ListNode headNode) {
ListNode listNode1 = headNode;
//输出
while (listNode1 != null) {
System.out.println(listNode1.val);
listNode1= listNode1.next;
}
}
老实人踩坑:
老实人思路1:
- eg : l1 = [2,4,3], l2 = [5,6,4]
- 挨个将值从链表中取出来 “243“ ”564”
- 用字符串接收后反转 “342” “465”,求和 807
- 再反转存入插入链表 [7,0,8]
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//创建头节点
ListNode result = new ListNode();
//移动节点
ListNode result1 = result;
String s1 = "";
String s2 = "";
while (l1 != null || l2 != null ){
if (l1 != null){
s1 = s1 + l1.val;
l1 = l1.next;
}
if (l2 != null) {
s2 = s2 + l2.val;