tags
date
type
status
slug
category
summary
password
icon
算法讲解011【入门】链表入门题目-两个链表相加
链表入门题目-两个链表相加大纲
前置知识:理解链表及其基本调整 建议:做过这个题的同学跳过
- 给你两个 非空 的链表,表示两个非负的整数
- 它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字
- 请你将两个数相加,并以相同形式返回一个表示和的链表
- 你可以假设除了数字 0 之外,这两个数都不会以 0 开头
链表题目在笔试、面试中的意义就是检验coding能力如何
更难的题目会在【必备】课程里讲述
视频笔记
- 这题就是考链表的调整,不用想着绕过题目
- 先准备两个链表
ans = null , cur = null
,定义一个carry = 0
表示s是否进位
- for 循环 终止条件, h1 和 h2都为空,每次h1和h2都会跳,到空不再跳
- 定义
sum
作为中间存储变量,val = sum %10
表示这一位数字实际结果(其实就是不管进不进为位,只要个位) ,carry=sum / 10
判断要不要进位 - 接着
if else
判断建表没有(ans
是否为空),如果为空, 创建一个ans
节点,存放val
ans
只有一开始两个数字相加后,作为头节点创建,后续不再使用- 否则让
curr.next
指向新的节点,并且这个节点存放新的val
,然后让curr
指向curr.next
- 如此循环,在循环判断里头,要注意如果有一个链表走完了,那么有一个 h 要为 0 ,另一个继续取节点
- 最后判断还有没有进位,如果有进位也要把它加上去,然后返回
ans
- 如图
- 第二遍看的时候想把
ans
节点剔除掉进行优化代码,但是我发现实际上ans
节点存储的是新链表的头节点,不能剔除
package
class011;// 给你两个 非空 的链表,表示两个非负的整数// 它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字// 请你将两个数相加,并以相同形式返回一个表示和的链表。// 你可以假设除了数字 0 之外,这两个数都不会以 0 开头// 测试链接:https://leetcode.cn/problems/add-two-numbers/
public
class
AddTwoNumbers { // 不要提交这个类
public
static
class
ListNode {
public
int
val;
public
ListNode next;
public
ListNode(
int
val) {
this
.val = val; }
public
ListNode(
int
val, ListNode next) {
this
.val = val;
this
.next = next; } }
class
Solution { // 也可以复用老链表 // 不过这个实现没有这么做,都是生成的新节点(为了教学好懂)
public
static
ListNode addTwoNumbers(ListNode h1, ListNode h2) { ListNode ans = null, cur = null;
int
carry = 0;
for
(
int
sum, val; // 声明变量 h1 != null || h2 != null; // 终止条件 h1 = h1 == null ? null : h1.next, // 每一步h1的跳转 h2 = h2 == null ? null : h2.next // 每一步h2的跳转 ) { sum = (h1 == null ? 0 : h1.val) + (h2 == null ? 0 : h2.val) + carry; val = sum % 10; carry = sum / 10;
if
(ans == null) { ans =
new
ListNode(val); cur = ans; }
else
{ cur.next =
new
ListNode(val); cur = cur.next; } }
if
(carry == 1) { cur.next =
new
ListNode(1); }
return
ans; } }}
- 作者:瑾墨
- 链接:https://www.gaoqilan.tech/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/1071a31f-082e-8085-a498-d499d362669b
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。