链表部分经典题目

不懂的话就给我留言吧,虽然我也菜

题目一: 如何判断一个单链表是否有环?有环的话返回进入环的第一个节点,无环的话返回空

  • 要求: 如果链表长度为N,请做到时间复杂度为O(N),额外空间复杂度为O(1),注意这个题目的隐含条件是没有重复元素

  • 思路1: 如果没有额外空间复杂度的限制的话,我们可以用哈希表或者hashset实现,即我们去遍历整个链表,将节点不断添加到哈希表/hashset中,当其put()/add()方法返回false时,该元素就是环形的入口,此时停止遍历,返回结果即可.

  • 思路2: 我们给定一个快指针和慢指针,快指针一次走两步,慢指针一次走一步,
  • 如果没有环,快指针会很快到达节点末尾的空节点位置,直接返回空.

  • 如果有环,那么快指针和慢指针一定会在环中的某个地方相遇,然后让快指针从头结点重新开始走,不过这时候快指针一次也只走一步,他们再次相遇的点一定是环的入口,这是一个结论,记住就行,反正我也不会证明哈哈

  • 思路2代码

题目二: 如何判断两个无环单链表是否相交?相交返回第一个相交的节点,不相交返回空

  • 要求: 如果两个链表长度分别为M,N,那么请做到时间复杂度为O(M+N),额外空间复杂度为O(1).

  • 注意:

  • 两个单链表相交之后肯定是走一条线,不可能形成X形状的相交的哈,因为单链表只有一个next指针,不可能同时指向两个节点.
  • 思路一: 如果没有额外空间复杂度的限制的话,我们还是可以通过哈希表或者hashset来做,先遍历其中一条单链表
  • 思路二: 先遍历两个链表获得他们的长度,然后让长的先走比短的多出来的部分,当剩余长度相同时,再一起走,碰到的第一个相等的节点就是交点,如果任意一个走到末尾了还没有相等的节点,那就说明不相交,返回空即可

  • 例: 链表1长度为6,具体为:1->2->3->4->5->6->null, 链表2长度为4,具体为: 2->4->5->6->null,其中4号节点为他们的交点,我们让链表1先走6-4=2步,然后一起走,他们在4号节点一定相交.

题目三: 如何判断两个有环单链表是否相交?相交返回第一个相交的节点,不相交返回空

  • 要求: 如果两个链表长度分别为M,N,那么请做到时间复杂度为O(M+N),额外空间复杂度为O(1)

  • 注意(这个题有点麻烦):

  • 如果两个有环链表相交的话,那么相交之后肯定走的是一个环,切记切记单链表是不可能形成X形的,它只有一个next指针,请收起你们天花乱坠的想象哈哈哈

  • 这里有个隐含条件,就是两个有环链表来说,每个环中元素都是不重复的

  • 思路: 我们可以先找到两个有环链表的入环节点,就是上面的题目一,然后根据入环节点判断他们是否相交,有三种情况:
  • 第一种情况, 两个链表在同一个节点入环(就是两个节点是同一个对象,不仅仅是值相等哈),这时候我们需要找到的是入环前的相交节点,如果入环前没有相交,就返回入环的节点(做法和找到两个无环单链表相交节点类似了,不过这里的结束条件是到达入环节点而不是某一个链表为空).
  • 第一种情况如图
    有环链表交点第一种情况
  • 第二种情况, 两个入环节点不在同一个,而且各自成环,没有相交,直接返回null,怎么判断呢?从其中一个单链表的入环开始,遍历环直到回到了入环节点,看之间能否找到另一个节点的入环节点,有就返回任意一个入环节点,没有就说明没有相交,返回null.
  • 第二种情况如图
    有环链表交点第二种情况
  • 第三种情况, 两个单链表相交,但是入环节点不是同一个,返回随便哪一个都行,如何判断相交了呢,和第二种情况判断一样,从其中一个单链表的入环开始,遍历环直到回到了入环节点,看之间能否找到另一个节点的入环节点,有就返回任意一个入环节点.
  • 第三种情况如图
    有环链表交点第三种情况

题目四: 给定两个单链表的头结点head1,head2,如何判断两个单链表是否相交?相交返回第一个相交的节点,不相交返回空

  • 这个题就是上面几个题的综合,我懒得写了哈哈哈,上面几个写了这个肯定就会了,思路图片我放这里吧
  • 思路图:
    思路
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值