🌈hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。
✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!
🔥个人主页:Ethan Yankang
🔥推荐:史上最强八股文 || 一分钟看完我的上千篇博客
🔥温馨提示:划到文末发现专栏彩蛋 点击这里直接传送
🔥本篇概览:数据结构与算法 || 详细讲解了对齐法、殊途同归法子啊相交节点之间的巧妙使用。🌈⭕🔥
【计算机领域一切迷惑的源头都是基本概念的模糊,算法除外】
目录
🌈序言
算法乃我长久之志也,此关必过。今日得此代码随想录之良品辅助,应按此路学之习之,而长久不可懈怠。
前一系列文章详细讲解了快慢指针删除倒数节点的问题,建议先将这部分知识掌握之后再来学习本篇内容,点击查看。
🔥 代码随想录20——链表6——快慢指针法——删除链表的倒数第N个节点-CSDN博客
🌈引出
面试题 02.07. 链表相交
同:160.链表相交
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
示例 1:
示例 2:
示例 3:
剖析题干重点:
🔥思路分析:
就紧抓一点!!!——
只要相交了,后面的所有都相同,因为有的一个地址相同的话,全部地址都是相同的。
所以对齐法是理所应当的。
对齐法:
比较的是指针。其实如果是值的话,不相交的节点,值可能相同,所以必须是指针,而且无论从哪个方面来讲,都只能是指针。
殊途共归法:
还有一种方法,称之为殊途同归问题。
设A、B链表的长度分别为a,b,设两者相交的节点为node,设交点之后的长度为c(这是公共的),则A链表在交点之前的长度为a-c,B链表在交点之前的长度为b-c。
因为a-c+b=b-c+a
所以只要A链表遍历结束后,遍历B链表;B链表遍历结束后,遍历A链表。则遍历完一轮后,两者一定相交,这个点就是node交点。
可以理解为两链表都走了两段路,只不过是一前一后的,走完这两段路之后,两者一定碰头。
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode A = headA, B = headB;
while (A != B) {
A = A != null ? A.next : headB;
B = B != null ? B.next : headA;
}
return A;
}
}
最终代码:
🔥对齐法
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
// 首先确保只要有交点就行,不管是什么样子的。只要相交了,后面一定全部是相同的。
int countA=0;
int countB=0;
ListNode curA=headA;
ListNode curB=headB;
//先求AB长度
while(curA!=null){
countA++;
curA=curA.next;
}
while(curB!=null){
countB++;
curB=curB.next;
}
int i=0,j=0;
curA=headA;
curB=headB;
//再使之尾部对齐
if(countA>countB){
for(i=0;i<countA-countB;i++){
curA=curA.next;
}
for(i=countA-countB;i<countA;i++){
if(curA==curB){
return curA;
}
curA=curA.next;
curB=curB.next;
}
}else{
for(j=0;j<countB-countA;j++){
curB=curB.next;
}
for(j=countB-countA;j<countB;j++){
if(curA==curB){
return curB;
}
curA=curA.next;
curB=curB.next;
}
}
return null;
}
}
🔥殊途同归法
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode A = headA, B = headB;
while (A != B) {
A = A != null ? A.next : headB;
B = B != null ? B.next : headA;
}
return A;
}
}
🌈今日总结:
1.没有意识到一旦相交,后面的必定全部相等。
2.没有意思到是指针相等,而非值相等。
3.没有想到殊途同归法
📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!
👇下面是专栏彩蛋系列,你会喜欢的!(为了避免影响算法的简洁与优美,这里直接将之前的几十个专栏简化为3个部分,不过你点击开后发现惊喜。)👇
💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖
热门专栏
💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖