从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. .net 调用存储过程

    语言:C# 一.调用带输入参数的存储过程 首先自然是在查询分析器里创建一个存储过程喽~~   如下所示: create proc proc_1 @uid int, @pwd varchar(255) ...

  2. 【洛谷 P5017】 摆渡车(斜率优化)

    题目链接 算是巩固了一下斜率优化吧. 设\(f[i]\)表示前\(i\)分钟最少等待时间. 则有\(f[i]=\min_{j=0}^{i-m}f[j]+(cnt[i]-cnt[j])*i-(sum[i ...

  3. 原生JS获取HTML DOM元素的8种方法

    JS获取DOM元素的方法(8种) 通过ID获取(getElementById) 通过name属性(getElementsByName) 通过标签名(getElementsByTagName) 通过类名 ...

  4. JavaScript的深浅复制

    JavaScript的深浅复制 为什么有深复制.浅复制? JavaScript中有两种数据类型,基本数据类型如undefined.null.boolean.number.string,另一类是Obje ...

  5. org.springframework.dao.DuplicateKeyException: 问题

    转自:https://blog.51cto.com/chengxuyuan/1786938 org.springframework.dao.DuplicateKeyException: a diffe ...

  6. Linux下MySQL的数据文件存放在哪里的??

    http://bbs.csdn.net/topics/390620630 mysql> show variables like '%dir%';+------------------------ ...

  7. 一道简单的广搜题:Knight Moves

    这本来是要用双向宽度搜索的,但是我用简单的广搜也成功了,L<=300,也不会超时?? 另外一个问题就是,我本来想用原来的代码交,结果80分??将边界条件从小于L改成小于等于L,就对了.我可能不会 ...

  8. 《BUG创造队》作业8:软件测试与Alpha冲刺(第二天)

    项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 BUG创造队 作业学习目标 (1)掌握软件测试基础技术.(2)学习 ...

  9. dt二次开发之-地区链接伪静态标签用法

    用法:开启伪静态功能,参照前台,看看哪里有按照地区浏览,然后打开对应的模块和模板,修改 <a href="{$MOD[linkurl]}search.php?areaid={$v[ar ...

  10. java中List与数组的转换

    1.数组转换成List public static <T> List<T> asList(T... a) String[] arr = new String[] {" ...