Merge remote-tracking branch 'origin/master'

# Conflicts:
#	LeetCode/src/main/java/leetcode/editor/cn/all.json
#	LeetCode/src/main/java/leetcode/editor/cn/translation.json
This commit is contained in:
huangge1199 2021-03-23 08:31:09 +08:00
commit 825cd6cb4f
8 changed files with 795 additions and 0 deletions

View File

@ -0,0 +1,126 @@
//请你设计一个队列支持在前后三个位置的 push pop 操作
//
// 请你完成 FrontMiddleBack
//
//
// FrontMiddleBack() 初始化队列
// void pushFront(int val) val 添加到队列的 最前面
// void pushMiddle(int val) val 添加到队列的 正中间
// void pushBack(int val) val 添加到队里的 最后面
// int popFront() 最前面 的元素从队列中删除并返回值如果删除之前队列为空那么返回 -1
// int popMiddle() 正中间 的元素从队列中删除并返回值如果删除之前队列为空那么返回 -1
// int popBack() 最后面 的元素从队列中删除并返回值如果删除之前队列为空那么返回 -1
//
//
// 请注意当有 两个 中间位置的时候选择靠前面的位置进行操作比方说
//
//
// 6 添加到 [1, 2, 3, 4, 5] 的中间位置结果数组为 [1, 2, 6, 3, 4, 5]
// [1, 2, 3, 4, 5, 6] 的中间位置弹出元素返回 3 数组变为 [1, 2, 4, 5, 6]
//
//
//
//
// 示例 1
//
//
//输入
//["FrontMiddleBackQueue", "pushFront", "pushBack", "pushMiddle", "pushMiddle",
//"popFront", "popMiddle", "popMiddle", "popBack", "popFront"]
//[[], [1], [2], [3], [4], [], [], [], [], []]
//输出
//[null, null, null, null, null, 1, 3, 4, 2, -1]
//
//解释
//FrontMiddleBackQueue q = new FrontMiddleBackQueue();
//q.pushFront(1); // [1]
//q.pushBack(2); // [1, 2]
//q.pushMiddle(3); // [1, 3, 2]
//q.pushMiddle(4); // [1, 4, 3, 2]
//q.popFront(); // 返回 1 -> [4, 3, 2]
//q.popMiddle(); // 返回 3 -> [4, 2]
//q.popMiddle(); // 返回 4 -> [2]
//q.popBack(); // 返回 2 -> []
//q.popFront(); // 返回 -1 -> [] 队列为空
//
//
//
//
// 提示
//
//
// 1 <= val <= 109
// 最多调用 1000 pushFront pushMiddle pushBack popFront popMiddle popBack
//
//
// Related Topics 设计 链表
// 👍 5 👎 0
package leetcode.editor.cn;
import java.util.ArrayList;
import java.util.List;
//1670:设计前中后队列
public class DesignFrontMiddleBackQueue {
public static void main(String[] args) {
//测试代码
// Solution solution = new PDesignFrontMiddleBackQueue().new Solution();
}
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class FrontMiddleBackQueue {
List<Integer> list;
public FrontMiddleBackQueue() {
list = new ArrayList<>(1000);
}
public void pushFront(int val) {
list.add(0, val);
}
public void pushMiddle(int val) {
list.add(list.size()/2, val);
}
public void pushBack(int val) {
list.add(val);
}
public int popFront() {
if (list.isEmpty()) {
return -1;
}
return list.remove(0);
}
public int popMiddle() {
if (list.isEmpty()) {
return -1;
}
return list.remove((list.size()-1) / 2);
}
public int popBack() {
if (list.isEmpty()) {
return -1;
}
return list.remove(list.size()-1);
}
}
/**
* Your FrontMiddleBackQueue object will be instantiated and called as such:
* FrontMiddleBackQueue obj = new FrontMiddleBackQueue();
* obj.pushFront(val);
* obj.pushMiddle(val);
* obj.pushBack(val);
* int param_4 = obj.popFront();
* int param_5 = obj.popMiddle();
* int param_6 = obj.popBack();
*/
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,129 @@
//请实现 copyRandomList 函数复制一个复杂链表在复杂链表中每个节点除了有一个 next 指针指向下一个节点还有一个 random 指针指
//向链表中的任意节点或者 null
//
//
//
// 示例 1
//
//
//
// 输入head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
//输出[[7,null],[13,0],[11,4],[10,2],[1,0]]
//
//
// 示例 2
//
//
//
// 输入head = [[1,1],[2,1]]
//输出[[1,1],[2,1]]
//
//
// 示例 3
//
//
//
// 输入head = [[3,null],[3,0],[3,null]]
//输出[[3,null],[3,0],[3,null]]
//
//
// 示例 4
//
// 输入head = []
//输出[]
//解释给定的链表为空空指针因此返回 null
//
//
//
//
// 提示
//
//
// -10000 <= Node.val <= 10000
// Node.random 为空null或指向链表中的节点
// 节点数目不超过 1000
//
//
//
//
// 注意本题与主站 138 题相同https://leetcode-cn.com/problems/copy-list-with-random-point
//er/
//
//
// Related Topics 链表
// 👍 168 👎 0
package leetcode.editor.cn;
import com.code.leet.entiy.Node;
import java.util.Arrays;
import java.util.List;
//剑指 Offer 35:复杂链表的复制
public class FuZaLianBiaoDeFuZhiLcof {
public static void main(String[] args) {
//测试代码
Solution solution = new FuZaLianBiaoDeFuZhiLcof().new Solution();
List<Integer> var = Arrays.asList(7, 13, 11, 10, 1);
List<Integer> random = Arrays.asList(null, 0, 4, 2, 0);
Node head = new Node(0);
head = head.setHead(var, random);
solution.copyRandomList(head);
}
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
/*
// Definition for a Node.
class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
*/
class Solution {
public Node copyRandomList(Node head) {
if (head == null) {
return null;
}
Node clone = head;
while (clone != null) {
Node temp = new Node(clone.val);
temp.next = clone.next;
clone.next = temp;
clone = temp.next;
}
clone = head;
while (clone != null) {
if (clone.random != null) {
clone.next.random = clone.random.next;
}
clone = clone.next.next;
}
clone = head.next;
Node temp = head;
Node newHead = clone;
while (temp != null && newHead != null) {
if (temp.next.next != null) {
temp.next = temp.next.next;
newHead.next = newHead.next.next;
} else {
temp.next = null;
}
temp = temp.next;
newHead = newHead.next;
}
return clone;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,91 @@
//给定一个链表如果它是有环链表实现一个算法返回环路的开头节点
//
// 如果链表中有某个节点可以通过连续跟踪 next 指针再次到达则链表中存在环 为了表示给定链表中的环我们使用整数 pos 来表示链表尾连接到链表中的
//位置索引从 0 开始 如果 pos -1则在该链表中没有环注意pos 不作为参数进行传递仅仅是为了标识链表的实际情况
//
//
//
// 示例 1
//
//
//
//
//输入head = [3,2,0,-4], pos = 1
//输出tail connects to node index 1
//解释链表中有一个环其尾部连接到第二个节点
//
//
// 示例 2
//
//
//
//
//输入head = [1,2], pos = 0
//输出tail connects to node index 0
//解释链表中有一个环其尾部连接到第一个节点
//
//
// 示例 3
//
//
//
//
//输入head = [1], pos = -1
//输出no cycle
//解释链表中没有环
//
//
//
// 进阶
//
//
// 你是否可以不用额外空间解决此题
//
//
//
// Related Topics 链表
// 👍 64 👎 0
package leetcode.editor.cn;
import com.code.leet.entiy.ListNode;
import java.util.HashSet;
import java.util.Set;
//面试题 02.08:环路检测
public class LinkedListCycleLcci {
public static void main(String[] args) {
//测试代码
Solution solution = new LinkedListCycleLcci().new Solution();
}
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
Set<ListNode> listNodeSet = new HashSet<>();
while (head != null) {
if (!listNodeSet.add(head)) {
break;
} else {
head = head.next;
}
}
return head;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,96 @@
//给你一个链表数组每个链表都已经按升序排列
//
// 请你将所有链表合并到一个升序链表中返回合并后的链表
//
//
//
// 示例 1
//
// 输入lists = [[1,4,5],[1,3,4],[2,6]]
//输出[1,1,2,3,4,4,5,6]
//解释链表数组如下
//[
// 1->4->5,
// 1->3->4,
// 2->6
//]
//将它们合并到一个有序链表中得到
//1->1->2->3->4->4->5->6
//
//
// 示例 2
//
// 输入lists = []
//输出[]
//
//
// 示例 3
//
// 输入lists = [[]]
//输出[]
//
//
//
//
// 提示
//
//
// k == lists.length
// 0 <= k <= 10^4
// 0 <= lists[i].length <= 500
// -10^4 <= lists[i][j] <= 10^4
// lists[i] 升序 排列
// lists[i].length 的总和不超过 10^4
//
// Related Topics 链表 分治算法
// 👍 1215 👎 0
package leetcode.editor.cn;
import com.code.leet.entiy.ListNode;
//23:合并K个升序链表
public class MergeKSortedLists{
public static void main(String[] args) {
//测试代码
Solution solution = new MergeKSortedLists().new Solution();
}
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
ListNode result = null;
for (int i = 0; i < lists.length; i++) {
result = mergeTwoLists(result,lists[i]);
}
return result;
}
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
}
if (l2 == null) {
return l1;
}
if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,51 @@
//编写程序以 x 为基准分割链表使得所有小于 x 的节点排在大于或等于 x 的节点之前如果链表中包含 xx 只需出现在小于 x 的元素之后(如下所示)
//分割元素 x 只需处于右半部分即可其不需要被置于左右两部分之间
//
// 示例:
//
// 输入: head = 3->5->8->5->10->2->1, x = 5
//输出: 3->1->2->10->5->5->8
//
// Related Topics 链表 双指针
// 👍 54 👎 0
package leetcode.editor.cn;
import com.code.leet.entiy.ListNode;
//面试题 02.04:分割链表
public class PartitionListLcci {
public static void main(String[] args) {
//测试代码
Solution solution = new PartitionListLcci().new Solution();
}
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode temp = head;
ListNode current;
while (temp != null) {
while (temp.next != null && temp.next.val < x) {
current = temp.next;
temp.next = current.next;
current.next = head;
head = current;
}
temp = temp.next;
}
return head;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,118 @@
//给你一个链表 k 个节点一组进行翻转请你返回翻转后的链表
//
// k 是一个正整数它的值小于或等于链表的长度
//
// 如果节点总数不是 k 的整数倍那么请将最后剩余的节点保持原有顺序
//
// 进阶
//
//
// 你可以设计一个只使用常数额外空间的算法来解决此问题吗
// 你不能只是单纯的改变节点内部的值而是需要实际进行节点交换
//
//
//
//
// 示例 1
//
//
//输入head = [1,2,3,4,5], k = 2
//输出[2,1,4,3,5]
//
//
// 示例 2
//
//
//输入head = [1,2,3,4,5], k = 3
//输出[3,2,1,4,5]
//
//
// 示例 3
//
//
//输入head = [1,2,3,4,5], k = 1
//输出[1,2,3,4,5]
//
//
// 示例 4
//
//
//输入head = [1], k = 1
//输出[1]
//
//
//
//
//
// 提示
//
//
// 列表中节点的数量在范围 sz
// 1 <= sz <= 5000
// 0 <= Node.val <= 1000
// 1 <= k <= sz
//
// Related Topics 链表
// 👍 979 👎 0
package leetcode.editor.cn;
import com.code.leet.entiy.ListNode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
//25:K 个一组翻转链表
public class ReverseNodesInKGroup {
public static void main(String[] args) {
//测试代码
Solution solution = new ReverseNodesInKGroup().new Solution();
ListNode head = new ListNode(Arrays.asList(1, 2, 3, 4, 5));
solution.reverseKGroup(head, 2);
}
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
List<ListNode> list = new ArrayList<>();
while (head != null) {
list.add(head);
head = head.next;
}
int count = list.size() / k;
if (count == 0 || k == 1) {
return list.get(0);
}
for (int i = 0; i < count; i++) {
for (int j = i * k; j < (i + 1) * k; j++) {
if (j == i * k && i == count - 1) {
if(list.size() % k==0){
list.get(j).next = null;
}else{
list.get(j).next = list.get((i + 1) * k);
}
} else if (j == i * k) {
list.get(j).next = list.get((i + 2) * k - 1);
} else {
list.get(j).next = list.get(j - 1);
}
}
}
return list.get(k - 1);
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,85 @@
//给定两个用链表表示的整数每个节点包含一个数位
//
// 这些数位是反向存放的也就是个位排在链表首部
//
// 编写函数对这两个整数求和并用链表形式返回结果
//
//
//
// 示例
//
// 输入(7 -> 1 -> 6) + (5 -> 9 -> 2)即617 + 295
//输出2 -> 1 -> 9即912
//
//
// 进阶思考一下假设这些数位是正向存放的又该如何解决呢?
//
// 示例
//
// 输入(6 -> 1 -> 7) + (2 -> 9 -> 5)即617 + 295
//输出9 -> 1 -> 2即912
//
// Related Topics 链表 数学
// 👍 57 👎 0
package leetcode.editor.cn;
import com.code.leet.entiy.ListNode;
//面试题 02.05:链表求和
public class SumListsLcci {
public static void main(String[] args) {
//测试代码
Solution solution = new SumListsLcci().new Solution();
}
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
/**
* 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 sum = 0;
ListNode head = l1;
ListNode temp = null;
while (l1 != null && l2 != null) {
sum += l1.val + l2.val;
l1.val = sum % 10;
sum = sum / 10;
if (l1.next == null) {
temp = l1;
}
l1 = l1.next;
l2 = l2.next;
}
while (l1 != null) {
sum += l1.val;
l1.val = sum % 10;
sum = sum / 10;
if (l1.next == null) {
temp = l1;
}
l1 = l1.next;
}
while (l2 != null && temp != null) {
sum += l2.val;
temp.next = new ListNode(sum % 10);
sum = sum / 10;
temp = temp.next;
l2 = l2.next;
}
if (sum > 0) {
temp.next = new ListNode(sum);
}
return head;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}

View File

@ -0,0 +1,99 @@
//给你链表的头节点 head 和一个整数 k
//
// 交换 链表正数第 k 个节点和倒数第 k 个节点的值后返回链表的头节点链表 1 开始索引
//
//
//
// 示例 1
//
//
//输入head = [1,2,3,4,5], k = 2
//输出[1,4,3,2,5]
//
//
// 示例 2
//
//
//输入head = [7,9,6,6,7,8,3,0,9,5], k = 5
//输出[7,9,6,6,8,7,3,0,9,5]
//
//
// 示例 3
//
//
//输入head = [1], k = 1
//输出[1]
//
//
// 示例 4
//
//
//输入head = [1,2], k = 1
//输出[2,1]
//
//
// 示例 5
//
//
//输入head = [1,2,3], k = 2
//输出[1,2,3]
//
//
//
//
// 提示
//
//
// 链表中节点的数目是 n
// 1 <= k <= n <= 105
// 0 <= Node.val <= 100
//
// Related Topics 链表
// 👍 13 👎 0
package leetcode.editor.cn;
import com.code.leet.entiy.ListNode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
//1721:交换链表中的节点
public class SwappingNodesInALinkedList {
public static void main(String[] args) {
Solution solution = new SwappingNodesInALinkedList().new Solution();
// List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list = Arrays.asList(7, 9, 6, 6, 7, 8, 3, 0, 9, 5);
solution.swapNodes(new ListNode(list), 5);
}
//leetcode submit region begin(Prohibit modification and deletion)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode swapNodes(ListNode head, int k) {
List<ListNode> list = new ArrayList<>();
ListNode temp = head;
while (temp != null) {
list.add(temp);
temp = temp.next;
}
int tem = list.get(k - 1).val;
list.get(k - 1).val = list.get(list.size() - k).val;
list.get(list.size() - k).val = tem;
return head;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}