【算法学习】链表

本文介绍了哈希表的基础和在链表问题中的应用,如寻找链表公共部分和复制含随机指针的链表。有序表在Java中表现为TreeSet,具备set和map功能。快慢指针用于判断链表回文、排序以及找寻链表交点等。此外,讨论了不同情况下两个链表相交的判断方法。
摘要由CSDN通过智能技术生成

1. 哈希表

1.1 简介

在这里插入图片描述
第7条即一律8字节

2. 有序表

  • java中用TreeSet表示,包含set和map两种
  • 有序表的功能比哈希表更强大

2.1 有序表简介

在这里插入图片描述
在这里插入图片描述

3. 快慢指针

快指针一次走两步,慢指针一次走一步,快指针走完时,慢指针正好到中点

题目

笔试时只考虑时间复杂度,面试时需要考虑空间复杂度,因此下面都给出了几种解决办法

1. 链表公共部分

在这里插入图片描述
解:类似于快排。
如(1,3,5,10)和(5,2,10)
结果是(5,10)

2. 判断回文

判断一个单链表是不是回文
(1)创建一个栈,链表依次进去再弹出(此时栈中是链表的逆序),弹出一个和链表依次比对,如果一样就是回文
(2)栈中只存一半的链表,节约了空间
存储一半可以使用快慢指针
(3)只用几个有限变量呢
先用快慢指针,找到中点和最后一个节点,然后更改中点到最后一个节点的顺序,如:
在这里插入图片描述
然后p1从左往右走,p2从右往左,依次比对,直到中点
代码:
在这里插入图片描述
在这里插入图片描述

3. 排序

在这里插入图片描述
(1)每个节点放数组,然后快排
(2)只要几个变量
SH,ST,EH,ET,BH,BT分别为小于、等于、大于三个部分的头和尾节点,初始化为null
然后不断修改尾节点的next指针即可
在这里插入图片描述

4. 复制含随机指针的链表

在这里插入图片描述
(1)哈希表:key是node(老节点),value是node(新节点)。首先哈希表存储每个节点,然后依次查找,比如设置node1’ 的next和rand指针可以通过哈希表查找map.get(node1.next)
在这里插入图片描述

(2)改变原来的链表结构:
在这里插入图片描述
此时设置1’的rand指针等于1.rand.next

5. 两个单链表相交

在这里插入图片描述
判断一个单链表有没有环,可以用快慢指针:若有环,则一定两个指针会在环上相遇
在这里插入图片描述
此时,快指针回到原点,慢指针不动,以后每次两个指针都只走一步,一定会在第一个入环节点相遇。
(1)假设两个单链表都无环,此时若相交则一直到最后一个节点都应该相交,首先应该判断两个end节点是不是一个内存地址
先求两个链表长度,长链表先走差值步(因为相交最多也是短链表长度)
然后一起走,直到相遇
(2)一个单链表有环,一个没有
不可能相交。
(3)两个都有
A. 各自独立
B. 共用环,但入环节点可能不是一个
入环节点相同时和(1)一个思路
入环节点不同时任意一个入环节点继续往前,如果能遇到另一个入环节点则任意返回一个入环节点,否则不相交
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值