【LEETCODE】64、链表分类,medium&hard级别,题目:2,138,142,23
- 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的更多相关文章
- LeetCode:颜色分类【75】
LeetCode:颜色分类[75] 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 ...
- LeetCode 75. 颜色分类(Sort Colors) 30
75. 颜色分类 75. Sort Colors 题目描述 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中, ...
- LeetCode之链表总结
链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度.作为一种常用的数据结构,链表内置在很多高级编程语言里面.既比数组复杂又比树简单,所以链表经常被面试官 ...
- [array] leetcode - 39. Combination Sum - Medium
leetcode - 39. Combination Sum - Medium descrition Given a set of candidate numbers (C) (without dup ...
- [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 ...
- [array] leetcode - 48. Rotate Image - Medium
leetcode - 48. Rotate Image - Medium descrition You are given an n x n 2D matrix representing an ima ...
- [array] leetcode - 31. Next Permutation - Medium
leetcode - 31. Next Permutation - Medium descrition Implement next permutation, which rearranges num ...
- Leetcode解题-链表(2.2.0)基础类
1 基类的作用 在开始练习LeetCode链表部分的习题之前,首先创建好一个Solution基类,其作用就是: Ø 规定好每个子Solution都要实现纯虚函数test做测试: Ø 提供了List ...
- LeetCode之“链表”:Intersection of Two Linked Lists
此题扩展:链表有环,如何判断相交? 参考资料: 编程判断两个链表是否相交 面试精选:链表问题集锦 题目链接 题目要求: Write a program to find the node at whic ...
- LeetCode 单链表专题 (一)
目录 LeetCode 单链表专题 <c++> \([2]\) Add Two Numbers \([92]\) Reverse Linked List II \([86]\) Parti ...
随机推荐
- orm功能封装
封装功能: 查 : select **kwargs.keys() --返回-> obj -转为-->list [{},{}] ---> [obj,obj] class Models( ...
- 如何高效的阅读uni-app框架?(建议收藏)
作者 | Jeskson来源 | 达达前端小酒馆 uni-app的框架,配置:page.json,manifest.json,package.json,vue.config.js.脚本,应用程序,ma ...
- 重装了服务器,用的是centos/php微信小程序版,centos 命令大全
centos 命令大全 1.关机 (系统的关机.重启以及登出 ) 的命令 shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdo ...
- SpringCloud-Feign声明式服务调用
在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率 ...
- 多catch块的代码优化
一.多catch块的代码优化 在写代码时,多行存在不同的异常,使用try catch的话,习惯性的是有多个catch,如下所示: 注意到warning,文字描述如下: Reports identica ...
- IntelliJ IDEA 2019从入门到癫狂 图文教程!
阅读本文大概需要 6 分钟. 作者:yizhiwazi 来源:www.jianshu.com/p/9c65b7613c30 前言:IntelliJ IDEA 如果说IntelliJ IDEA是一款现代 ...
- Shell命令行提示定制
/******************************************************************************* * Shell命令行提示定制 * 说明 ...
- MYSQL报错:1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column
1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'rpa ...
- 阿里云mysql数据库恢复到本地
本地环境为win10,mysql引擎为InnoDB 第一步:服务里面停掉mysql 第二步:把my.ini 的 innodb_force_recovery 设置为0 第三步:把.frm和.idb文件 ...
- ubuntu 本地生成被浏览器信任的证书
vhosts添加https证书两步: 1:生成证书: sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl ...