package y2019.Algorithm.LinkedList.medium;

import y2019.Algorithm.LinkedList.ListNode;

/**
* @ProjectName: cutter-point
* @Package: y2019.Algorithm.LinkedList.medium
* @ClassName: AddTwoNumbers
* @Author: xiaof
* @Description: TODO 2. Add Two Numbers
* You are given two non-empty linked lists representing two non-negative integers.
* The digits are stored in reverse order and each of their nodes contain a single digit.
* Add the two numbers and return it as a linked list.
* You may assume the two numbers do not contain any leading zero, except the number 0 itself.
*
* Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
* Output: 7 -> 0 -> 8
* Explanation: 342 + 465 = 807.
* @Date: 2019/8/1 9:06
* @Version: 1.0
*/
public class AddTwoNumbers { public ListNode solution(ListNode l1, ListNode l2) {
//两数相加,用链表遍历相加进位即可
int increment = 0;
ListNode p1 = l1, p2 = l2, tail1 = p1, tail2 = p2;
while (p1 != null && p2 != null) {
int curValue = p1.val + p2.val + increment;
increment = curValue / 10;
curValue = curValue % 10;
p1.val = curValue; tail1 = p1;
tail2 = p2;
p1 = p1.next;
p2 = p2.next;
} //如果l1比较长
if (p2 == null && p1 != null) {
//吧剩下的加入链表
while (p1 != null) {
int curValue = p1.val + increment;
increment = curValue / 10;
curValue = curValue % 10;
p1.val = curValue; tail1 = p1;
p1 = p1.next;
}
} if (p1 == null && p2 != null) {
//吧剩下的加入链表
while (p2 != null) {
int curValue = p2.val + increment;
increment = curValue / 10;
curValue = curValue % 10;
tail1.next = new ListNode(curValue); tail1 = tail1.next;
p2 = p2.next;
}
} //最后添加increment节点
if (increment > 0) {
tail1.next = new ListNode(increment);
} return l1; } public static void main(String[] args) {
ListNode node1 = new ListNode();
node1.val = 9;
ListNode node2 = new ListNode();
node2.val = 9; node1.next = node2; ListNode node21 = new ListNode(); AddTwoNumbers fuc = new AddTwoNumbers(); fuc.solution(node1, node21); }
}
package y2019.Algorithm.LinkedList.medium;

import y2019.Algorithm.LinkedList.Node;

/**
* @ProjectName: cutter-point
* @Package: y2019.Algorithm.LinkedList.medium
* @ClassName: CopyRandomList
* @Author: xiaof
* @Description: TODO 138. Copy List with Random Pointer
* A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
* Return a deep copy of the list.
*
* Input:
* {"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}
*
* Explanation:
* Node 1's value is 1, both of its next and random pointer points to Node 2.
* Node 2's value is 2, its next pointer points to null and its random pointer points to itself.
*
* 思路,参考大神操作
* 1.首先吧链表复制,但是不拆开,复制出来的链表还是连在原来的链表上
* 2.根据上一个节点是下一个节点的原始复制对象,那么只需要吧random相应指向的节点的下一个
* 3.拆开复制的链表
* @Date: 2019/8/1 9:35
* @Version: 1.0
*/
public class CopyRandomList { public Node solution(Node head) {
if (head == null) return null;
//开始复制
Node p = head, p2, newHead, copy;
//1 step
while (p != null) {
//新节点指向原来的下一个节点
Node temp = new Node(p.val, p.next, p.random);
//原来旧节点指向新节点
p.next = temp;
//移动到下一个旧节点
p = temp.next;
} //2 step 修改random指向
p = head;
while (p != null) {
p2 = p.next;
if(p2.random != null) {
p2.random = p.random.next;//指向复制的节点 }
p = p.next.next;
} //3. step拆分链表
p = head;
Node nh = new Node(), np1 = nh, np2 = np1;
while (p != null) {
p2 = p.next.next; np1 = p.next;
np2.next = np1;
np2 = np1; p.next = p2;
p = p2;
} return nh.next; }
}
package y2019.Algorithm.LinkedList.medium;

import y2019.Algorithm.LinkedList.ListNode;

import java.util.HashMap;
import java.util.Map; /**
* @ProjectName: cutter-point
* @Package: y2019.Algorithm.LinkedList.medium
* @ClassName: DetectCycle
* @Author: xiaof
* @Description: TODO 142. Linked List Cycle II
* Given a linked list, return the node where the cycle begins. If there is no cycle, return null.
* To represent a cycle in the given linked list, we use an integer pos which represents the position (0-indexed) in the linked
* list where tail connects to. If pos is -1, then there is no cycle in the linked list.
*
* Input: head = [3,2,0,-4], pos = 1
* Output: tail connects to node index 1
* Explanation: There is a cycle in the linked list, where tail connects to the second node.
* @Date: 2019/8/1 8:57
* @Version: 1.0
*/
public class DetectCycle { public ListNode solution(ListNode head) { //针对有换问题,可以考虑用set,或者用2个指针,如果要找位置的话,感觉hashmap可能更好
Map nodeMap = new HashMap();
ListNode res = null, p = head;
int index = 0;
//遍历链表,直到遇到重复
while (p != null) {
//遍历获取下一个数据
if(nodeMap.containsKey(p)) {
//如果已经存在
res = p;
break;
} else {
//如果不包含
nodeMap.put(p, index++);
p = p.next;
}
} return res;
}
}
package y2019.Algorithm.LinkedList.hard;

import y2019.Algorithm.LinkedList.ListNode;

/**
* @ProjectName: cutter-point
* @Package: y2019.Algorithm.LinkedList.hard
* @ClassName: MergeKLists
* @Author: xiaof
* @Description: 23. Merge k Sorted Lists
* Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
* Input:
* [
* 1->4->5,
* 1->3->4,
* 2->6
* ]
* Output: 1->1->2->3->4->4->5->6
*
* 参考: 148. Sort List的解法
* @Date: 2019/8/1 10:28
* @Version: 1.0
*/
public class MergeKLists { public ListNode mergeKLists(ListNode[] lists) {
//多链表合并,可以简化为多个双链表合并,做循环即可
if (lists == null || lists.length == 0) {
return null;
} if (lists.length == 1) {
return lists[0];
}
//1,先取一个数组,然后循环遍历所有数组跟之前的数组做merge
ListNode res = lists[0];
for(int i = 1; i < lists.length; ++i) {
res = merge(res, lists[i]);
} return res;
} ListNode merge(ListNode l1, ListNode l2) { if(l1 == null && l2 == null) {
return null;
} else if (l1 == null) {
return l2;
} else if (l2 == null) {
return l1;
} //合并俩个链表
ListNode newl = new ListNode(0); //遍历两个链表,获取对应的位置添加到链表
//1。老规矩,获取前一个链表位置,后一个位置,当前位置
ListNode addl = newl, l1next = l1.next, l2next = l2.next, temp;
//2.吧需要添加进去的链表后面加上当前节点
while (l1 != null && l2 != null) {
//3.把当前节点的下一个索引断开
if(l1.val < l2.val) {
//如果是必第二个链表的小,那么我们用第一个链表
addl.next = l1;
temp = l1.next;
l1.next = null;
l1 = temp;
} else {
addl.next = l2;
temp = l2.next;
l2.next = null;
l2 = temp;
}
//4.吧当前索引指向下一个节点
addl = addl.next;
} //5.最后吧剩余的节点直接加入到新链表中
if(l1 != null) {
addl.next = l1;
} if(l2 != null) {
addl.next = l2;
} return newl.next;
}
}

【LEETCODE】64、链表分类,medium&hard级别,题目:2,138,142,23的更多相关文章

  1. LeetCode:颜色分类【75】

    LeetCode:颜色分类[75] 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 ...

  2. LeetCode 75. 颜色分类(Sort Colors) 30

    75. 颜色分类 75. Sort Colors 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中, ...

  3. LeetCode之链表总结

    链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度.作为一种常用的数据结构,链表内置在很多高级编程语言里面.既比数组复杂又比树简单,所以链表经常被面试官 ...

  4. [array] leetcode - 39. Combination Sum - Medium

    leetcode - 39. Combination Sum - Medium descrition Given a set of candidate numbers (C) (without dup ...

  5. [LeetCode] 64. Minimum Path Sum_Medium tag: Dynamic Programming

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  6. [array] leetcode - 48. Rotate Image - Medium

    leetcode - 48. Rotate Image - Medium descrition You are given an n x n 2D matrix representing an ima ...

  7. [array] leetcode - 31. Next Permutation - Medium

    leetcode - 31. Next Permutation - Medium descrition Implement next permutation, which rearranges num ...

  8. Leetcode解题-链表(2.2.0)基础类

    1 基类的作用 在开始练习LeetCode链表部分的习题之前,首先创建好一个Solution基类,其作用就是: Ø  规定好每个子Solution都要实现纯虚函数test做测试: Ø  提供了List ...

  9. LeetCode之“链表”:Intersection of Two Linked Lists

    此题扩展:链表有环,如何判断相交? 参考资料: 编程判断两个链表是否相交 面试精选:链表问题集锦 题目链接 题目要求: Write a program to find the node at whic ...

  10. LeetCode 单链表专题 (一)

    目录 LeetCode 单链表专题 <c++> \([2]\) Add Two Numbers \([92]\) Reverse Linked List II \([86]\) Parti ...

随机推荐

  1. 为什么vue组件中的data不是一个对象而是一个函数

    如果两个实例引用同一个对象,当其中一个实例的属性发生改变时,另一个实例属性也随之改变,只有当两个实例拥有自己的作用域时,才不会相互干扰. 这是因为JavaScript的特性所导致,在component ...

  2. Linux执行shell脚本的方法

    Linux下有个脚本/home/start.sh,常用的两种执行方法如下: 1../start.sh.注意此时start.sh脚本文件必须有可执行权限-x.类似的有以绝对路径来执行:/home/sta ...

  3. 虔诚的墓主人(BZOJ1227)(洛谷P2154)解题报告

    题目描述 小W是一片新造公墓的管理人.公墓可以看成一块N×M的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. 当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地. ...

  4. 组件&Props

    组件允许你将Ui拆分为独立可复用的代码片段,并对每个片段进行独立构思.本指南只在介绍组件的相关概念.你可以参考详细组件 API. 组件,从概念上类似与JavaScript函数.它接受任意的入参(既“p ...

  5. 启动uiautomatorview 提示无法初始化主类

    启动uiautomatorview 提示无法初始化主类, 重新安装jdk到1.8版本就好了,就是这么神奇.

  6. 一大波 Facebook Libra 技术文章来袭

    由于 Libra 具有真正的稳定的可编程货币的特性, Libra 或许可以带来又一波平台红利. 上周我们(深入浅出区块链技术社区)发起了 Libra 技术文档的翻译计划,到这周文档已经翻译了一半.欢迎 ...

  7. Cesium 1.54评测 【转】

    重要功能评测 3dtiles数据上画线和贴纹理   3dtiles数据上画线和贴纹理 把线条贴到3dtiles上需要用到两个属性:clampToGround和classificationType. c ...

  8. spatiaLite

  9. 推荐一个web字体转换工具TTF转SVG

    推荐一个web字体转换工具:https://www.fontsquirrel.com/tools/webfont-generator

  10. jconsole远程连接centos7 服务器上的tomcat来查看服务器状况(无密码版)

    1.修改tomcat  catalina.sh 代码解释:-Dcom.sun.management.jmxremote.port=6969 //连接端口,自定义不要与已有的端口冲突-Dcom.sun. ...