代码随想录算法训练营第4天 | 链表两两交换、删除倒N、链表相交、环形链表
1.代码随想录算法训练营第2天 | 数组滑动窗口、螺旋打印2.代码随想录算法训练营第1天 | 数组二分法、数组双指针3.代码随想录算法训练营第3天 | 链表删除元素、翻转链表
4.代码随想录算法训练营第4天 | 链表两两交换、删除倒N、链表相交、环形链表
5.代码随想录算法训练营第6天 | 哈希表的应用、复习快慢指针思想6.代码随想录算法训练营第7天 | 哈希表和双指针结合、三数和四数之和7.代码随想录算法训练营第8天 | 复习字符串API、双指针8.代码随想录算法训练营第9天 | 复习字符串匹配、KMP9.代码随想录算法训练营第10天 | 复习队列和栈10.代码随想录算法训练营第11天 | 复习逆波兰表达式求值11.代码随想录算法训练营第13天 | 复习二叉树基础12.代码随想录算法训练营第14天 | 复习二叉树翻转13.代码随想录算法训练营第15天 | 二叉树进阶14.代码随想录算法训练营第16天 | 二叉树更加进阶15.代码随想录算法训练营第17天 | 复习二叉搜索树16.代码随想录算法训练营第18天 | 二叉搜索树进阶17.代码随想录算法训练营第20天 | 二叉搜索树中级18.代码随想录算法训练营第21天 | 二叉搜索树结尾19.代码随想录算法训练营第22天 | 开始复习回溯20.代码随想录算法训练营第23天 | 回溯进阶21.代码随想录算法训练营第24天 | 复习组合问题22.代码随想录算法训练营第25天 | 回溯问题完结23.代码随想录算法训练营第27天 | 初入贪心24.代码随想录算法训练营第28天 | 贪心进阶2024年7月6日
两两交换链表元素
继续用虚拟头节点,多建立几个记录指针。
题24. 两两交换链表中的节点
/**
* 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 swapPairs(ListNode head) {
if(head==null){
return null;
}
if(head.next==null){
return head;
}
ListNode nextSpan = head.next.next;
ListNode vir = new ListNode();
vir.next = head;
ListNode before = vir;
while(true){
ListNode cur1 = before.next;
ListNode cur2 = cur1.next;
before.next = cur2;
cur2.next = cur1;
cur1.next = nextSpan;
before = cur1;
cur1 = before.next;
if(cur1==null||cur1.next==null){
break;
}
cur2 = cur1.next;
nextSpan = cur2.next;
}
return vir.next;
}
}
题19. 删除链表的倒数第n个节点
双指针法
第二个指针先移动n+1个,当到末尾时,第一个指针的下一个就删除。
/**
* 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 removeNthFromEnd(ListNode head, int n) {
ListNode vir = new ListNode();
vir.next = head;
ListNode fast = vir;
ListNode slow = vir;
for(int i=0;i<=n;i++){
fast = fast.next;
}
while(fast!=null){
slow = slow.next;
fast = fast.next;
}
slow.next = slow.next.next;
return vir.next;
}
}
面试题 02.07. 链表相交
求出长度差值,然后长的切掉多出来的,然后依次比较节点是否相同。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA==null||headB==null){
return null;
}
ListNode p1 = headA,p2=headB;
int a=1,b=1;
while(p1.next!=null){
p1 = p1.next;
a+=1;
}
while(p2.next!=null){
p2=p2.next;
b+=1;
}
p1 = headA;
p2 = headB;
int cha = Math.abs(a-b);
if(a>b){
for(int i=0;i<cha;i++){
headA = headA.next;
}
}else{
for(int i=0;i<cha;i++){
headB = headB.next;
}
}
p1 = headA;
p2 = headB;
while(p1!=null || p2!=null){
if(p1==p2){
return p1;
}else{
p1 = p1.next;
p2 = p2.next;
}
}
return null;
}
}
环形链表
不需要虚拟头节点,快慢指针,相交之后,从相交点和head到入环位置的距离相同。
/**
* 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) {
if(head==null){
return null;
}
ListNode fast=head,slow=head;
do{
fast=fast.next;
if(fast==null){
return null;
}
fast = fast.next;
slow = slow.next;
if(fast==null){
return null;
}
}while(fast!=slow);
fast = head;
while(fast!=slow){
fast = fast.next;
slow = slow.next;
}
return fast;
}
}
合集:
代码随想录算法训练营
标签:
代码随想录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端