从C语言的指针开始,我的算法之路就结束了!

今天为了找个好的实习,不得不捡起来,写了三年的web,算法落下了太多了

今天在leetcode上刷题,难在了一个简单的链表上,因此记录一下

题目:给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
   你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

解题过程是几经波折的,最开始弄出来的答案还是头插式的,并且还超时了,真菜

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int flag=0;//用于判断是否进位 1为进位,0为不进,可以直接做数值存储
     int sum=0; //用于存放当前位相加的和
int i1=0;  //l1的val
int i2=0;  //l2的val
ListNode head=new ListNode(0); //声明一个节点为头节点,因为是尾插,最终的node为最后一个节点的节点值
ListNode node=head;  //声明一个临时变量,用于尾插的操作
while(l1!=null||l2!=null){
       //如果当前节点为空,则赋值为0,方便继续运算
il = (l1 !=null) ? l1.val : 0;if(l2!=null){
i2=l2.val;
}else{
i2=0;
} sum=i1+i2+flag; //得到当前运算的和
flag=sum/10;  //是否进位        //对当前节点尾插一个节点,存储当前节点的值 第一次运算时,相当于head.next=new ListNode(7) 这也是为什么最后返回head.next的原因
node.next=new ListNode(sum%10);
       //将当前节点的next赋值给当前节点,即将指针移到链表的尾部
node=node.next;
if (l1 != null) l1 = l1.next;
if (l2 != null) l2 = l2.next;
}
     //如果最后又进位,再给尾部插入一个新的节点
if (flag > 0) {
node.next = new ListNode(flag);
}
return head.next;
}
}

在本题中,采用的是尾插法,不停的在链表的尾部插入新的节点

取值时,只需要对最开始的head进行向下取值即可

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

0.开始循环之前

head={
val : 0
next : null
}
node={
val : 0
next : null
}

1.第一次循环

node.next=new ListNode(sum%10);
运行结果:
node={
val : 0
next : {
val : 7
next : null
}
}
由于head=node:
head={
val : 0
next : {
val : 7
next : null
}
}
node=node.next;
运行结果:
node={
val : 7
next : null;
} head不变

2.第二次循环

node.next=new ListNode(sum%10);
运行结果:
node={
val : 7
next : {
val : 0
next : null
}
}
由于head=node:
head={
val : 0
next : {
val : 7
next : {
val : 0
next : null
}
}
}
node=node.next;
运行结果:
node={
val : 0
next : null;
} head不变

3.第三次循环

node.next=new ListNode(sum%10);
运行结果:
node={
val : 0
next : {
val : 8
next : null
}
}
由于head=node:
head={
val : 0
next : {
val : 7
next : {
val : 0
next : {
val : 8
next : null
}
}
}
}
node=node.next;
运行结果:
node={
val : 8
next : null;
} head不变

4.返回结果

head={
val : 0
next : {
val : 7
next : {
val : 0
next : {
val : 8
next : null
}
}
}
} head.next={
val : 7
next : {
val : 0
next : {
val : 8
next : null
}
}
}

5.总结

最开始的head节点是整个运算中不动的,node节点相当于其的一个尾巴,
不断的添加数据到自身,然后后移到添加的节点上去 类似于一个贪吃蛇,head节点一直不变,node节点是一个工作节点(长度为1)
  他的工作是找到一个新的节点,让其附着在自己的next上(node.next=new ListNode)
  然后移到到这个新的节点上去(node=node.next)
  重复这项工作

菜鸟的算法入门:java的链表操作的更多相关文章

  1. [算法]用java实现堆操作

    问题描述:(1)建堆:将数组A[1..n]变成一个最大堆.(课本6.3)(2)堆排序:将一个堆中的元素按递减排序输出.(3)用插入方法建堆:堆大小从1到n每次插入一个元素到堆中,直到n个元素入堆.(课 ...

  2. Java实现链表的常见操作算法

    链表分为单链表,双向链表和循环链表,是一种链式存储结构,由一个个结点链式构成,结点包含数据域和指针域,其中单链表是只有一个指向后驱结点的指针,双向链表除头结点和尾结点外,每个结点都有一个前驱指针和一个 ...

  3. 算法 - 链表操作思想 && case

    算法 - 链表操作题目套路 前面这一篇文章主要讲链表操作时候的实操解决方式,本文从本质讲解链表操作的元信息,学完后,再也不怕链表操作题目了. 1.链表的基本操作 链表的基本操作无外乎插入,删除,遍历 ...

  4. JAVA 链表操作:循环链表

    主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...

  5. 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】

    [109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 ...

  6. 【LeetCode-面试算法经典-Java实现】【114-Flatten Binary Tree to Linked List(二叉树转单链表)】

    [114-Flatten Binary Tree to Linked List(二叉树转单链表)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a bin ...

  7. Redis入门和Java利用jedis操作redis

    Redis入门和Java利用jedis操作redis Redis介绍 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库. Redis 与其他 key - val ...

  8. LeetCode入门指南 之 链表

    83. 删除排序链表中的重复元素 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 .返回同样按升序排列的结果链表. class Soluti ...

  9. 十大经典排序算法(java实现、配图解,附源码)

    前言: 本文章主要是讲解我个人在学习Java开发环境的排序算法时做的一些准备,以及个人的心得体会,汇集成本篇文章,作为自己对排序算法理解的总结与笔记. 内容主要是关于十大经典排序算法的简介.原理.动静 ...

随机推荐

  1. Ubuntu18.04防火墙相关

    Ubuntu 18.04 LTS 系统中已经默认附带了 UFW 工具,如果您的系统中没有安装,可以在「终端」中执行如下命令进行安装: sudo apt install ufw 检查UFW状态 sudo ...

  2. 深入理解JVM(五) -- 垃圾回收算法

    上篇文章我们了解到哪些内存区域和哪些对象可以被回收,这篇文章我们就来了解一下具体的垃圾回收算法的思路,不讨论具体的实现. 一 最基础算法 标记-清除(Mark-Swap) 为什么说他是最基础的算法,因 ...

  3. kubernetes第六章--如何访问pod

  4. SQL*Plus 格式化查询结果

    为了在 SQL*Plus 环境中生成符合用户需要规范的报表,SQL*Plus 工具提供了多个用于格式化查询结果的命令,使用这些命令可以实现设置列的标题.定义输出值的显示格式和显示宽度.为报表增加头标题 ...

  5. error: unknown filesystem; grub rescue

    我的电脑是win10+ubumtu双系统 在一次windows更新之后,系统无法进入win10和linux系统,出现如图错误 解决方案1: 大部分中文博客的解决方案:这里有个更加详细的: https: ...

  6. Python学习日记(五) 编码基础

    初始编码 ASCII最开始为7位,一共128字符.最后确定8位,一共256个字符,最左边的为拓展位,为以后的开发做准备. ASCII码的最左边的一位为0. 基本换算:8位(bit) = 1字节(byt ...

  7. Elasticsearch 是什么

    Elasticsearch 是什么 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功 ...

  8. MySQL Connection--使用tcpkill杀掉MySQL活跃连接

    当MySQL连接被打满,连管理员也无法本地登录时,可以考虑使用tcpkill杀掉一些应用服务器创建的连接. CentOS 6安装tcpkill rpm安装包: libnids-1.24-1.el6.x ...

  9. SQL PLUS 远程连接数据库

    -- SQL PLUS 远程连接Oracle数据库(WINDOWS+SQL PLUS)命令:用户名/密码@ip地址[:端口]/service_name [as sysdba] EG: ORCL/ORC ...

  10. Redis主从同步之主库挂死解决方案

    Redis实现了主从同步,但是主库挂死了,如何处理 方案:切换主库的身份 # 连接从库 [root@localhost redis-]# redis-cli -p # 取消从库身份 > slav ...