![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构和算法设计
木乔流水人家
悟以往之不谏,知来者之可追
展开
-
相交链表
解法一是遍历一遍其中一个链表,用哈希表存储地址,再遍历另一个链表时,在哈希表中查询是否存在同样的结点。这种思路比较简单,就是比较费内存。 解法二就是利用双指针,定义一个pA指向A链表,再定义一个pB指向B链表。当pA走到A链表尾时,让它下一步指向B链表,pB也类似一样操作,思路就是让它们都遍历一遍A链表和B链表,两个指针走的步数一样多,他们一定会有相同的时候,如果相同的时候,都为null,那说明无相交点,因为都走到两个链表的尾部了还不相同。如果不为null,那个点一定是相交点的开始。这种空间复杂度要原创 2021-02-28 14:20:01 · 109 阅读 · 0 评论 -
环形链表
解法一就是遍历链表,把没有访问过的结点放进哈希表里,一旦当前访问的结点是哈希表里的结点,就代表当前结点被访问了两次,这个链表一定存在环。这种比较占存储空间。 解法二就是使用步长不一致的指针,也叫快慢指针,核心思想是龟兔赛跑算法。快指针一次走两步,慢指针一次走一步,如果快指针和慢指针重合,说明链表有环。这里需要注意,快指针和慢指针的起点问题,如果用的while循环,那么快指针就在头结点的下一个结点。当快指针指向null或者快指针的下一个指向null时,那么该链表是不存在环的。代码如下:public原创 2021-02-25 15:24:43 · 89 阅读 · 0 评论 -
复制带随机指针的链表
解题思路是先创建一条复制链表,复制链表的val和原始链表的val相对应,创建过程中,使用哈希表建立原始结点和复制结点的映射。原始结点为key,复制结点为value。那么,在复制链表中查询当前结点的随机指针时,当前对应原始结点的随机指针所映射的值value就是这个复制结点的随机指针。这个解题思路关键在于利用哈希表的键值对的映射关系。代码如下:/*// Definition for a Node.class Node { int val; Node next; Node ra原创 2021-02-25 14:40:51 · 187 阅读 · 0 评论 -
合并K个升序链表
解法一:合并K个升序链表,可以化为进行K-1次两个升序链表的合并,简单粗暴,直接遍历链表数组,将两个升序链表合并后的结果继续与下一个升序链表合并,直到链表数字中无需要合并的链表。代码暂无。解法二:采用分治法合并,将链表数组里面的链表不断二分,二分完了再往上合并,就是不断合并已经合并的链表。这里需要注意一下链表数组为空的情况。这种方法基本就是分治法的思想。代码如下:/** * Definition for singly-linked list. * public class ListNode {原创 2021-02-24 15:38:45 · 307 阅读 · 0 评论 -
删除链表的倒数第n个结点
题目要求扫描一遍删除倒数第n个结点,所以不建议算出链表的长度,好的解决方法是使用快慢指针,快慢指针一开始都指向第一个结点。为了能删除倒数第n个结点, 我希望快指针为null时,慢指针指向倒数第n+1个结点,这样就能快速删除倒数第n个结点。那么快指针就比慢指针快n+1步。 假如我们定义链表长度为s,那么倒数第n+1个结点实际上是处于s-n这个位置,也就是说慢指针需要走s-(n+1)步。在循环中,快指针走了n+1次时,慢指针才开始走。当然,如果要删除的是第一个结点,那么快指针就走不到n+1次,只能走n次原创 2021-02-24 14:41:06 · 52 阅读 · 0 评论 -
合并两个有序链表
解法一:这种解法就是默认把l2的结点插入到l1当中,可把l1和l2直接当做移动指针,并为l1设置一个前驱指针pre, 再比较l1和l2当前结点的值哪个更小,如果l1的值小于l2,则将l2这个结点插入到l1这个结点之前,移动pre和l2,否则移动pre和l1。逐个比较每个结点,直到这两个移动指针任意一个为空。但是这种想法就还需要考虑l1是否为空、插入的结点位置是不是在头结点之前等。略微有点麻烦,这个运行时间短,占用内存大一些。/** * Definition for singly-linked list原创 2021-02-24 13:38:29 · 42 阅读 · 0 评论 -
两数相加(链表)
解法一: 定义两个移动指针pointer1和pointer2,分别指向两个链表,定义一个进位变量index。在对两个链表逐位相加时,可不分配额外的内存给最终的结果,直接原地更新两个链表的值,最终肯定选长的链表作为最终结果。如果最高位相加还要进一位,还是要额外申请内存给进位。对于长度不相同的链表还是要注意进位。因为要选择更长的链表作为最终结果,所以需要判断移动指针哪个为空哪个不为空,显然是比较复杂的。但是也算是一种解法,我以为可以节省内存,但是在leetcodeleetcodeleetcode上运行时并没原创 2021-02-24 10:35:38 · 56 阅读 · 0 评论