首页 > 其他分享 >面试题 02.07. 链表相交

面试题 02.07. 链表相交

时间:2023-11-21 22:25:45浏览次数:43  
标签:面试题 ListNode 02.07 next 链表 headB null 指针

2023-11-21

面试题 02.07. 链表相交 - 力扣(LeetCode)

思路:

1 暴力法:判断的是next是不是相等

1 hashmap存储其中一个的全部,遍历另一个看是不是在map中(用set就行,不用map)

2 双指针:用2个指针分别遍历2链表(都是遍历完一个继续遍历另一个),最终会相等的,

相等就是找到了

暴力法:

/**
 * 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 l1=new ListNode();
        l1.next=headA;
        ListNode l2=new ListNode();
        l2.next=headB;
 
 
        boolean f=false;
 
        ListNode temp1 =l1;
        ListNode temp2=l2;
        while(temp1.next!=null){
            while(temp2.next!=null){
                if(temp1.next==temp2.next){
                    break;
                }
                temp2=temp2.next;
            }
 
 
            if(temp2!=null && temp1.next==temp2.next){
                f=true;
                break;
            }
            temp2=l2;
            temp1=temp1.next;
        }
 
        if(f){
            return temp1.next;
        }
 
        return null;
 
    }
}

hashmap:这里用的是set集合

/**
 * 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) {
       //时间复杂度可以降低为O(n),借助1个set就行,,但是空间占用多,还可以优化
 
       //此链表相交特殊,没有x型相交的, 所以第一个相交的点之后一定是全部相交的
       //链表的相交也不可能是x型,交点的后一个一定确定的
       //时间复杂度为O(n) ,且O(1)内存
 
        //2个天才思路
        //2思路最坏情况效率一样,其余都是2方法效率高
 
            //1 先后指针
            //先统计2链表长度,长度差就是先指针在长链表先走的距离,
            //然后2指针一起走,直到出现相等就是找到了 / 都走到最后,就是没有
 
            //2 双指针           
            //2指针从2链表开始一起走,出现相等就找到了,出现一个指针走完,让其转到另一个链表开头继续
            // 1  3
            // 1  3
            // 1----------3
            // 2----------3
            // 1-3-2     2-3-1
            //有就一定会出现相等的情况,都转了后还是都为null,说明没有
 
 
    //借助set
        if(headA==null || headB==null){
            return null;
        }
 
        ListNode a=headA;
 
        Set<ListNode> set=new HashSet<ListNode>();
        while(a!=null){
            set.add(a);
            a=a.next;
        }
 
 
        ListNode b=headB;
        while(b!=null){
            if(set.contains(b)){
                return b;
            }
            b=b.next;
        }
 
        return null;
 
 
 
    }
}

双指针:

/**
 * 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) {
       //时间复杂度可以降低为O(n),借助1个set就行,,但是空间占用多,还可以优化
 
       //此链表相交特殊,没有x型相交的, 所以第一个相交的点之后一定是全部相交的
       //链表的相交也不可能是x型,交点的后一个一定确定的
       //时间复杂度为O(n) ,且O(1)内存
 
        //2个天才思路
        //2思路最坏情况效率一样,其余都是2方法效率高
 
            //1 先后指针
            //先统计2链表长度,长度差就是先指针在长链表先走的距离,
            //然后2指针一起走,直到出现相等就是找到了 / 都走到最后,就是没有
 
            //2 双指针           
            //2指针从2链表开始一起走,出现相等就找到了,出现一个指针走完,让其转到另一个链表开头继续
            // 1  3
            // 1  3
            // 1----------3
            // 2----------3
            // 1-3-2     2-3-1
            //有就一定会出现相等的情况,都转了后还是都为null,说明没有
 
    //优雅双指针
        if (headA == null || headB == null) {
            return null;
        }
        ListNode pA = headA, pB = headB;
        while (pA != pB) {
            pA = pA == null ? headB : pA.next;
            pB = pB == null ? headA : pB.next;
        }
        return pA;
 
 
 
    }
}

 

标签:面试题,ListNode,02.07,next,链表,headB,null,指针
From: https://www.cnblogs.com/youye9527/p/17847745.html

相关文章

  • 142. 环形链表 II
    2023-11-21142.环形链表II-力扣(LeetCode)思路:1hashmap:将其next一个个存入,直到找到next已经存在的,这里用set就行2快慢指针,一个一步步走,一个一次走2步,自己画一下图,其一定会在环中相遇,且一定是多走一圈,然后相遇时,将慢指针保留,继续走,重新定义一个指针从一开始走,他们相等时就......
  • 单链表建表,倒置,遍历(不使用Class,简洁易懂)
    在C++中通过递归方法实现单链表倒置初始化列表structListNode{ intval; LiseNode*next; ListNode(intx):val(x),next(NULL){}};遍历voidquery_node(){ node*p=head; while(p!=NULL){ cout<<p->data<<''; p=p->nxt; } cout<<endl;}建表(......
  • 前端vue经典面试题78道(重点详细简洁)
    前端vue经典面试题78道(重点详细简洁)目录1.自我介绍2.vue面试题1.v-show和v-if区别的区别:2.为何v-for要用key3.描述vue组件声明周期mm单组件声明周期图​父子组件生命周期图4.vue组件如何通信5.描述组件渲染和更新的过程1、vue组件初次渲染过程2、vue组件更新过程6......
  • Android并发编程高级面试题汇总(含详细解析 八)
    Android并发编程高级面试题汇总最全最细面试题讲解持续更新中......
  • vue面试题_vue2和vue3的区别
    1、数据绑定原理不同vue2:vue2的数据绑定是利用ES5的一个API:Object.definePropert()对数据进行劫持,结合发布订阅模式的方式来实现的。vue3:vue3中使用了ES6的ProxyAPI对数据代理。相比vue2.x,使用proxy的优势如下:defineProperty只能监听某个属性,不能对全对象监听可以省去fori......
  • (链表)20-旋转链表
    1/**2*Definitionforsingly-linkedlist.3*publicclassListNode{4*intval;5*ListNodenext;6*ListNode(){}7*ListNode(intval){this.val=val;}8*ListNode(intval,ListNodenext){this.val=val;......
  • 19. 删除链表的倒数第 N 个结点
    2023-11-2019.删除链表的倒数第N个结点-力扣(LeetCode)思路:    1先遍历一遍,计算链表长度,再遍历一遍,完成    2双指针:先后指针,先走n步,再一起走    3栈,先全入栈,再出栈完成双指针:‘/***Definitionforsingly-linkedlist.*publicclass......
  • JavaSE面试题02:单例设计模式
    单例模式来源:https://www.runwsh.com/archives/biitngg1f7s00001.什么事Singleton?Singleton:在Java中即指单例设置模式,探视软件开发最常用的设置模式之一通俗解释:单例模式单:唯一例:实例单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式......
  • 常见面试题-MySQL软删除以及索引结构
    为什么mysql删了行记录,反而磁盘空间没有减少?答:在mysql中,当使用delete删除数据时,mysql会将删除的数据标记为已删除,但是并不去磁盘上真正进行删除,而是在需要使用这片存储空间时,再将其从磁盘上清理掉,这是MySQL使用延迟清理的方式。延迟清理的优点:如果mysql立即删除数据,会导......
  • 面试必刷TOP101:30、 二叉搜索树与双向链表
    题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示题解方法一:非递归版解题思路:1.核心是中序遍历的非递归算法。2.修改当前遍历节点与前一遍历节点的指针指向。importjava.util.Stack;publicTreeNodeConvertBSTToBiList(TreeNoderoot){......