代码随想录21——链表7——对齐法、殊途同归法——求两链表相交节点

🌈hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。

✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!

🔥个人主页:Ethan Yankang
🔥推荐:史上最强八股文 || 一分钟看完我的上千篇博客

🔥温馨提示:划到文末发现专栏彩蛋   点击这里直接传送

🔥本篇概览:数据结构与算法 || 详细讲解了对齐法、殊途同归法子啊相交节点之间的巧妙使用。🌈⭕🔥


【计算机领域一切迷惑的源头都是基本概念的模糊,算法除外】


目录

🌈序言

🌈引出

面试题 02.07. 链表相交

剖析题干重点:

🔥思路分析:

对齐法:

殊途共归法:

最终代码:

🔥对齐法

🔥殊途同归法 

🌈今日总结:


🌈序言

算法乃我长久之志也,此关必过。今日得此代码随想录之良品辅助,应按此路学之习之,而长久不可懈怠。

前一系列文章详细讲解了快慢指针删除倒数节点的问题,建议先将这部分知识掌握之后再来学习本篇内容,点击查看。


🔥 代码随想录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个部分,不过你点击开后发现惊喜。)👇


💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖

热门专栏

🌈🌈专栏彩蛋系列

🌈🌈史上最全八股文,欢迎收藏

🌈🌈一篇文章了解我的上千篇博客

💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖


  • 29
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值