当前位置:网站首页>LeetCode questions 1-10
LeetCode questions 1-10
2022-08-10 20:26:00 【weixin_47358951】
LeetCode 1-10题
BM1 反转链表
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头.
数据范围: 0≤n≤1000
要求:空间复杂度 O(1) ,时间复杂度 O(n) .
如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}.
输入:{1,2,3}
返回值:{3,2,1}
import java.util.*;
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null){
return head;
}
ListNode pre = null;
ListNode pHead = head;
ListNode pNext;
while(pHead!=null){
pNext = pHead.next;
pHead.next = pre;
pre = pHead;
pHead = pNext;
}
return pre;
}
}
BM2 链表内指定区间反转
将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n),空间复杂度 O(1).
例如:给出的链表为 1→2→3→4→5→NULL, m=2,n=4, 返回 1→4→3→2→5→NULL.
数据范围: 链表长度 0<size≤1000,0<m≤n≤size,链表中每个节点的值满足 ∣val∣≤1000
要求:时间复杂度 O(n) ,空间复杂度 O(n)
进阶:时间复杂度 O(n),空间复杂度 O(1)
输入:{1,2,3,4,5},2,4
返回值:{1,4,3,2,5}
import java.util.*;
/* * public class ListNode { * int val; * ListNode next = null; * } */
public class Solution {
/** * * @param head ListNode类 * @param m int整型 * @param n int整型 * @return ListNode类 */
public ListNode reverseBetween (ListNode head, int m, int n) {
// write code here
if(head==null || m==n){
return head;
}
ListNode pHead = new ListNode(-1);
ListNode pre = head;
if(m==1){
pHead.next = pre;
ListNode temp = pHead.next;
for(int i=1; i<n; i++){
temp = temp.next;
}
ListNode post = temp.next;
temp.next = null;
temp = pHead.next;
temp = Reverse(temp);
head = temp;
while(temp.next!=null){
temp = temp.next;
}
temp.next = post;
return head;
} else{
for(int i=1; i<m-1; i++){
pre = pre.next;
}
pHead.next = pre.next;
ListNode temp = pHead.next;
pre.next = null;
for(int i=m; i<n; i++){
temp = temp.next;
}
ListNode post = temp.next;
temp.next = null;
temp = pHead.next;
// 反转
temp = Reverse(temp);
pre.next = temp;
while(temp.next!=null){
temp = temp.next;
}
temp.next = post;
return head;
}
}
public ListNode Reverse (ListNode head){
if(head==null){
return head;
}
ListNode pre = null;
ListNode post;
while(head!=null){
post = head.next;
head.next = pre;
pre = head;
head = post;
}
return pre;
}
}
BM3 链表中的节点每k个一组翻转
将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身.
数据范围:0≤n≤2000 , 1≤k≤2000 ,链表中每个元素都满足 0≤val≤1000
要求空间复杂度 O(1),时间复杂度 O(n)
例如:
给定的链表是 1→2→3→4→5
对于 k = 2 , 你应该返回 2→1→4→3→5
对于 k = 3 , 你应该返回 3→2→1→4→5
输入:{1,2,3,4,5},2
返回值:{2,1,4,3,5}
import java.util.*;
/* * public class ListNode { * int val; * ListNode next = null; * } */
public class Solution {
/** * * @param head ListNode类 * @param k int整型 * @return ListNode类 */
public ListNode reverseKGroup (ListNode head, int k) {
// write code here
ListNode temp = new ListNode(-1);
ListNode ppp = temp;
int i = 0;
while(head!=null){
ListNode node = new ListNode(-1);
node.next = head;
ListNode pre = node.next;
for(int j=1; j<=k & node.next!=null; j++){
node = node.next;
i = i + 1;
}
head = node.next;
if(i%k==0){
// System.out.println(i);
node.next = null;
ListNode p = reverse(pre);
temp.next = p;
while(p.next!=null){
p = p.next;
}
temp = p;
} else{
temp.next = pre;
}
}
// ListNode temp = reverse(head);
return ppp.next;
}
public ListNode reverse(ListNode head){
if(head==null){
return head;
}
ListNode pre = null;
ListNode post;
while(head!=null){
post = head.next;
head.next = pre;
pre = head;
head = post;
}
return pre;
}
}
BM4 合并两个排序的链表
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的.
数据范围: 0≤n≤1000,−1000≤节点值≤1000
要求:空间复杂度 O(1),时间复杂度 O(n)
如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},
或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4}
输入:{1,3,5},{2,4,6}
返回值:{1,2,3,4,5,6}
import java.util.*;
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
ListNode p = new ListNode(-1);
ListNode temp = p;
while(list1!=null & list2!=null){
if(list1.val>list2.val){
p.next = list2;
list2 = list2.next;
p = p.next;
} else{
p.next = list1;
list1 = list1.next;
p = p.next;
}
}
while(list1==null & list2!=null){
p.next = list2;
list2 = list2.next;
p = p.next;
}
while(list2==null & list1!=null){
p.next = list1;
list1 = list1.next;
p = p.next;
}
return temp.next;
}
}
BM5 合并k个已排序的链表
合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点.
数据范围:节点总数满足 0≤n≤100000 ,链表个数满足 1≤k≤100000 ,每个链表的长度满足 1≤len≤200 ,每个节点的值满足 ∣val∣<=1000
要求:时间复杂度 O(nlogk)
输入:[{1,2,3},{4,5,6,7}]
返回值:{1,2,3,4,5,6,7}
import java.util.*;
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */
public class Solution {
public ListNode mergeKLists(ArrayList<ListNode> lists) {
// if(lists.isEmpty()){
// ListNode node = new ListNode(-1);
// node = node.next;
// return node;
// }
// ListNode node = lists.get(0);
// for(int i=1; i<lists.size(); i++){
// node = merge(node, lists.get(i));
// }
// 0 - lists.size()-1
return mergeList(lists, 0, lists.size()-1);
}
// 归并排序
public ListNode mergeList(ArrayList<ListNode> lists, int left, int right){
if(left==right)
return lists.get(left);
if(left>right)
return null;
int mid = (left+right)/2;
return merge(mergeList(lists, left, mid), mergeList(lists, mid+1, right));
}
public ListNode merge(ListNode list1, ListNode list2) {
ListNode p = new ListNode(-1);
ListNode temp = p;
while(list1!=null & list2!=null){
if(list1.val>=list2.val){
p.next = list2;
list2 = list2.next;
p = p.next;
} else{
p.next = list1;
list1 = list1.next;
p = p.next;
}
}
if(list1==null & list2!=null){
p.next = list2;
}
if(list2==null & list1!=null){
p.next = list1;
}
return temp.next;
}
}
BM6 判断链表中是否有环
判断给定的链表中是否有环.如果有环则返回true,否则返回false.
数据范围:链表长度 0≤n≤10000,链表中任意节点的值满足 ∣val∣<=100000
要求:空间复杂度 O(1),时间复杂度 O(n)
输入分为两部分,第一部分为链表,第二部分代表是否有环,然后将组成的head头结点传入到函数里面.-1代表无环,其它的数字代表有环,这些参数解释仅仅是为了方便读者自测调试.实际在编程时读入的是链表的头节点.
输入:{3,2,0,-4},1
返回值:true
说明:第一部分{3,2,0,-4}代表一个链表,第二部分的1表示,-4到位置1(注:头结点为位置0),即-4->2存在一个链接,组成传入的head为一个带环的链表,返回true
import java.util.*;
/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */
public class Solution {
public boolean hasCycle(ListNode head) {
if(head==null || head.next==null || head.next.next==null){
return false;
}
ListNode p1 = head;
ListNode p2 = head.next;
while(p1!=null){
if(p1==p2){
return true;
}
if(p2==null || p2.next==null){
return false;
}
p1 = p1.next;
p2 = p2.next.next;
}
return false;
}
}
BM7 链表中环的入口结点
给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null.
数据范围: n≤10000,1<=结点值<=10000
要求:空间复杂度 O(1),时间复杂度 O(n)
输入描述:
输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台会根据第二段是否为空将这两段组装成一个无环或者有环单链表
返回值描述:
返回链表的环的入口结点即可,我们后台程序会打印这个结点对应的结点值;若没有,则返回对应编程语言的空结点即可.
输入:{1,2},{3,4,5}
返回值:3
说明:返回环形链表入口结点,我们后台程序会打印该环形链表入口结点对应的结点值,即3
import java.util.*;
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } */
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead) {
if(pHead==null || pHead.next==null || pHead.next.next==null){
return null;
}
ListNode p1 = pHead;
ListNode p2 = pHead.next;
while(p1!=null){
if(p1==p2){
if(pHead==p1.next){
return pHead;
}
pHead = pHead.next;
p1 = p1.next;
p2 = p2.next;
} else{
if(p2==null || p2.next==null){
return null;
}
p1 = p1.next;
p2 = p2.next.next;
}
}
return null;
}
}
BM8 链表中倒数最后k个结点
输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点.
如果该链表长度小于k,请返回一个长度为 0 的链表.
数据范围:0≤n≤100000
0≤ai≤1000000000, 0≤k≤1000000000
要求:空间复杂度 O(n),时间复杂度 O(n)
进阶:空间复杂度 O(1),时间复杂度 O(n)
输入:{1,2,3,4,5},2
返回值:{4,5}
说明:返回倒数第2个节点4,系统会打印后面所有的节点来比较.
import java.util.*;
/* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */
public class Solution {
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pHead ListNode类 * @param k int整型 * @return ListNode类 */
public ListNode FindKthToTail (ListNode pHead, int k) {
if(pHead==null || k==0){
return null;
}
// write code here
ListNode p = pHead;
int i = 1;
while(i<k){
pHead = pHead.next;
if(pHead==null){
return null;
}
i = i + 1;
}
while(pHead.next!=null){
p = p.next;
pHead = pHead.next;
}
return p;
}
}
BM9 删除链表的倒数第n个节点
给定一个链表,删除链表的倒数第 n 个节点并返回链表的头指针
例如,给出的链表为: 1→2→3→4→5, n=2.
删除了链表的倒数第 n 个节点之后,链表变为1→2→3→5.
数据范围: 链表长度 0≤n≤1000,链表中任意节点的值满足 0≤val≤100
要求:空间复杂度 O(1),时间复杂度 O(n)
备注:题目保证 n 一定是有效的
输入:{1,2},2
返回值:{2}
import java.util.*;
/* * public class ListNode { * int val; * ListNode next = null; * } */
public class Solution {
/** * * @param head ListNode类 * @param n int整型 * @return ListNode类 */
public ListNode removeNthFromEnd (ListNode head, int n) {
if(n==1 && head.next==null){
return head.next;
}
// write code here
ListNode temp = head;
ListNode pre = head;
int i = 1;
while(i<n){
head = head.next;
i = i + 1;
}
if(head.next==null){
return pre.next;
}
while(head.next.next!=null){
head = head.next;
temp = temp.next;
}
temp.next = temp.next.next;
return pre;
}
}
BM10 两个链表的第一个公共结点
输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空.(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
数据范围: n≤1000
要求:空间复杂度 O(1),时间复杂度 O(n)
输入描述:
输入分为是3段,第一段是第一个链表的非公共部分,第二段是第二个链表的非公共部分,第三段是第一个链表和第二个链表的公共部分. 后台会将这3个参数组装为两个链表,并将这两个链表对应的头节点传入到函数FindFirstCommonNode里面,用户得到的输入只有pHead1和pHead2.
返回值描述:
返回传入的pHead1和pHead2的第一个公共结点,后台会打印以该节点为头节点的链表.
输入:{1,2,3},{4,5},{6,7}
返回值:{6,7}
说明:第一个参数{1,2,3}代表是第一个链表非公共部分,第二个参数{4,5}代表是第二个链表非公共部分,最后的{6,7}表示的是2个链表的公共部分, 这3个参数最后在后台会组装成为2个两个无环的单链表,且是有公共节点的
import java.util.*;
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if(pHead1==null || pHead2==null){
return null;
}
int sum1 = 1;
// 长链表
ListNode p1 = pHead1;
while(pHead1.next!=null){
pHead1 = pHead1.next;
sum1 = sum1 + 1;
}
int sum2 = 1;
// 短链表
ListNode p2 = pHead2;
while(pHead2.next!=null){
pHead2 = pHead2.next;
sum2 = sum2 + 1;
}
int sum3 = 0;
if(sum1<sum2){
ListNode p = p1;
p1 = p2;
p2 = p;
sum3 = sum2 - sum1;
} else{
sum3 = sum1 - sum2;
}
sum1 = 1;
while(sum1<=sum3){
p1 = p1.next;
sum1 = sum1 + 1;
}
while(p1!=null){
if(p1==p2){
return p1;
}
p1 = p1.next;
p2 = p2.next;
}
return null;
}
}
边栏推荐
- 铱钌合金/氧化铱仿生纳米酶|钯纳米酶|GMP-Pd纳米酶|金钯复合纳米酶|三元金属Pd-M-Ir纳米酶|中空金铂合金纳米笼核-多空二氧化硅壳纳米酶
- Public Key Retrieval is not allowed(不允许公钥检索)【解决办法】
- Ransom Letter Questions and Answers
- 【SemiDrive源码分析】【MailBox核间通信】52 - DCF Notify 实现原理分析 及 代码实战
- 电脑如何去掉u盘写保护的状态
- 深度学习实战教程(一):感知器
- "POJ 3666" Making the Grade problem solution (two methods)
- Apple Font Lookup
- 链表应用----约瑟夫问题
- 每日一R「03」Borrow 语义与引用
猜你喜欢
转铁蛋白修饰长春新碱-粉防己碱脂质体|转铁蛋白修饰共载紫杉醇和金雀异黄素脂质体(试剂)
[Natural Language Processing] [Vector Representation] PairSupCon: Pairwise Supervised Contrastive Learning for Sentence Representation
【语义分割】2015-UNet MICCAI
(十)图像数据的序列与反序列化
链表应用----约瑟夫问题
Common ports and services
Ransom Letter Questions and Answers
详叙c中的分支与循环
Iridium Ruthenium Alloy/Iridium Oxide Biomimetic Nanozyme | Palladium Nanozyme | GMP-Pd Nanozyme | Gold-Palladium Composite Nanozyme | Ternary Metal Pd-M-Ir Nanozyme |shell nanozyme
@Autowired注解 --required a single bean, but 2 were found出现的原因以及解决方法
随机推荐
MATLAB设计,FPGA实现,联合ISE和Modelsim仿真的FIR滤波器设计
深度学习实战教程(一):感知器
手把手教你Charles抓包工具使用
铱钌合金/氧化铱仿生纳米酶|钯纳米酶|GMP-Pd纳米酶|金钯复合纳米酶|三元金属Pd-M-Ir纳米酶|中空金铂合金纳米笼核-多空二氧化硅壳纳米酶
【语义分割】2016-SegNet TPAMI
opengrok搭建[通俗易懂]
Demis Hassabis:AI 的强大,超乎我们的想象
Ransom Letter Questions and Answers
argparse——命令行参数解析
nfs挂载服务器,解决挂载后无法更改用户id,无法修改、写文件,文件只读权限Read-only file system等问题
Implementation of graceful exit in Golang
从 Delta 2.0 开始聊聊我们需要怎样的数据湖
一维数组动态和问题答记
Rider调试ASP.NET Core时报thread not gc-safe的解决方法
Water-soluble alloy quantum dot nanozymes|CuMoS nanozymes|porous silicon-based Pt(Au) nanozymes|[email protected] nanomimetic e
Pt/CeO2单原子纳米酶|[email protected] NPs纳米酶|碳纳米管负载铂颗粒纳米酶|白血病拮抗多肽修饰的FeOPtPEG复合纳米酶
不止跑路,拯救误操作rm -rf /*的小伙儿
30分钟使用百度EasyDL实现健康码/行程码智能识别
(10) Sequence and deserialization of image data
whois信息收集&企业备案信息