一些链表问题

一般链表问题用HashTable的话就会很简单,but we can do better



如果是用数组,或者栈保存数据,那没的说,但是题目要求空间O(1),

那就先把一半的链表逆序,OK






除了普通的指针指向下一个Node,还指向了一个随机的Node,那可以

1. 用HashTable记录对应关系,先复制一遍,再把random指向关系搞定

2. 遇到没有建立的,就递归调用复制的函数,return前加到HashSet里面

3. 复制的时候加在原链表的后面,利用这个做法保证复制的链表可以很轻松的找到random Node,最后再把链表拆分成2个






Step 1:分别判断2个链表是不是有环,如果有,返回入环节点

      method:快慢指针,在环内相遇就把一个指针从头开始,继续一步步遍历,相遇节点即为入环节点

Step2:找2个链表相交节点,并返回

分3种情况:

      1. 一个有环,一个没环:不可能相交

      2. 两个都没环:先求2个链表长度l1,l2,然后让一个指针先走abs(l1-l2)

      3. 两个都有环:又分3种情况:

            (1)2个独立环

            (2)2个链表在进入环之前相交

            (3)2个链表共享环

           

先判断属于哪种情况:

如果2个环入口节点相同,就是(2)情况,否则就是(1),(3)中的一个

对于(1)(3),让一个环入口继续走,如果能走道另外一个入口,就是(3),否则(1)


对于(2)求第一个相交的节点,类似于求2个无环链表的情况,即:求head到环入口的length,再快指针先走length差值

对于(1)不相交

对于(3)随便返回其中的一个环入口节点即可

 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值