最近,闲来无事,随便瞄了一下Leetcode,然后有个题目,看到了比较感兴趣,所以,就自不量力学习了一下。
这个题目是: 给你两个非空的链表表示两个非负的整数它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表
看到这个题目,我本身是没有什么思路的,谁让我是一个菜鸡呢!没办法,只能阅读大佬们的代码,然后经过N次Debug,终于看懂了,现在我来演示一下,这个题目的解决方案
闲话懒得扯了,直接贴代码
package com.uci.java06;
/**
* @author: Jessica
* @date: 2022-01-26 14:34
* @desc:
*
* 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
* 请你将两个数相加,并以相同形式返回一个表示和的链表
*
* 链接:https://leetcode-cn.com/problems/add-two-numbers
**/
class Solution {
/**
* 先说下思路吧,其实就是小学题目,加法运算
* 一个数和另外一个数 倒着相加,得到807,然后把结果拆成单个数字
* 最后倒着回去,形成链表,变成 7=>0=>8=>null
*/
public static void main(String[] args) {
ListNode l1 = new ListNode(243);
ListNode l2 = new ListNode(564);
ListNode listNode = addTwoNumbers(l1, l2);
System.out.println(listNode);
}
//定义一个静态内部类,为什么要定义呢,是为了方便,不需要借助其他包
static class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
@Override
public String toString() {
//这句的意思是 ListNode cur= ListNode{val:xx,next{zzz}},拿到ListNode对象
ListNode cur = this;
String toString = "";
while (cur != null){ //先取出第一个val,然后将当前cur的next给到cur,递归取出val
toString += (cur.val + "=>");
cur = cur.next;
} //拼接打印
return toString + "null";
}
}
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//老实说,第一次看,有点懵逼,为什么要定义一个0呢,后来想了一下
//有参构造总得传个参数吧,int 只能给0
ListNode root = new ListNode(0);
ListNode cursor = root;
int carry = 0;//两个数相加以后,拆分需要一个变量,存放还没有拆掉的数
while(l1 != null || l2 != null || carry != 0) {
int l1Val = l1 != null ? l1.val : 0;
int l2Val = l2 != null ? l2.val : 0;
int sumVal = l1Val + l2Val + carry;//相加,没啥好说的
carry = sumVal / 10;//依次得到80,8
//sumVal % 10 会得到7,0,8,null,然后依次加入新链表,
ListNode sumNode = new ListNode(sumVal % 10);
//这个地方是最关键的地方,我之前认为ListNode cursor = root;是无效代码,完全可以root.next=sumNode
//后来我发现,不行,就是在这个地方,需要一个临时的变量 cursor,去更新root.next
//第一次cursor.next 为 val:7,next:null,然后cursor和root相等,顺便更新root.next
cursor.next = sumNode;
//sumNode为 val:7,next:null,将cursor.next重新置为空
cursor = sumNode;
/**
* 上面两行代码,就是想做一件事情,往root.next递归赋值
*/
//第一次循环,其实就已经把l1,l2 置为空了
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
}
//返回 root.next=7,0,8
return root.next;
}
}