从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. 1-redis使用笔记

    1.清空当前redis数据库缓存FLUSHDB flushdb 2.清空整个redis缓存FLUSHALL flushall 3.设置 SET w3ckey redis 4.获取 GET w3ckey ...

  2. vue中使用iview组件库实现图片的上传

    vue文件如下: iview中Upload 属性详情 https://www.iviewui.com/components/upload js文件 :

  3. dpkg文件缺失问题

    sudo apt-get update 命中:1 http://security.ubuntu.com/ubuntu bionic-security InRelease         命中:2 ht ...

  4. 设置yum自动更新

    [wang@brady ~]$ sudo yum -y install cronie yum-cron sudo vim /etc/yum/yum-cron.conf apply_updates = ...

  5. js 判断数组中是否包含某个元素(转载)

    来源:https://www.cnblogs.com/yunshangwuyou/p/10539090.html 方法一:array.indexOf(item,start):元素在数组中的位置,如果没 ...

  6. 隐藏Apache版本号及版本敏感信息

    在安装软件前,我们需要隐藏软件的版本号及版本其他信息,这样就大大提高了安全指数. 只隐藏版本号: 我们在主配置文件里:httpd.conf [root@bqh- ~]# curl -i bbs.bqh ...

  7. OSS阿里云相关文档

    OSS阿里云相关文档 oss文档链接

  8. C++(四十二) — 函数模板多态

     1.函数模板(参数多态) 相当于一个函数发生器,参数多态,可以重载. 普通函数和模板函数的本质区别: 普通函数的调用,可以进行隐式的类型转换: 函数模板的调用,使用类型参数化,严格按照类型进行匹配, ...

  9. 【转】java.io.Closeable接口

    说到java.io.Closeable接口就避不开java.lang.AutoCloseable接口,因为在java版本7.0时引入了java.lang.AutoCloseable接口,同时java. ...

  10. IDEA实用教程(六)—— 全局设置的两种方式

    五. 全局设置的两种方式 在启动界面进入全局设置 在编码界面进入全局设置 本项目配置 上面的这种设置仅对本项目生效,不会对其他项目生效.请特别注意!!!