链表刷题之旅.1

        这是一篇关于我最近在力扣上刷题的总结。这一篇不会涉及到代码,只是分享我在做题时的思路。

一.题目汇总

LCR 027. 回文链表 - 力扣(LeetCode)

LCR 023. 相交链表 - 力扣(LeetCode)

LCR 026. 重排链表 - 力扣(LeetCode)

二.解题思路

1.回文链表

我当时的第一个想法:

1.找到两个相邻的的节点且节点的val相等,如果没有的话就返回false,如果只有一个节点的话返回true。

2.从第二个绿色的箭头开始,进行逆置。

3.进行比较,红色对应的val蓝色对应的val,如果不同的话,那么就返回false,如果直到一方结束的话(红色或者蓝色为NULL),那么就返回true。

 看似没问题,只不过还是过不了,因为我忽略了另一种情况的出现,“1,2,0,2,1”情况下,一开始就找不到两个相邻节点的val值相同的情况,所以这种方法并不适合,是我陷入了惯性思维。

  第二种方法:

        把它给我们的值倒过来后在跟原来的逐个进行比较,因为题目提到了(如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。)然后如果相等那么就返回true,不相等返回false。

在这我使用的是带哨兵位的单向链表来进行操作。

1.使用的是 “头部入数据”。 

 2.就是和原来的链表进行比较。因为我这使用了动态内存开辟,所以还要进行空间的释放。

2.相交链表 

对于这个链表A,和B而言,它们可以分为哪些情况呢?

假如我们把上面的叫做A链表,下面叫做B链表,我们并不知知道A长还是B长。

最好的情况:

中等的情况:

最坏的情况:

对于相交,就A和B节点而言存在某一个节点它们的地址相同,依据这个来解题。

方法一:

我们通过嵌套循环来进行比较,形式上有点类似二维数组的打印。

只不过这种方法的时间复杂度是O(N^2)。

方法二:

对于A和B我们可以控制它的长度,使它在同一起点进行比较,这样一来时间复杂度大概是O(N)。

选择A,B中长度长的,用一个指针指向它,然后这个指针向后移动(这两个链表长度的差值)次。然后再通过循环进行比较。

3.重排链表

 

它的形式是“第一个,倒数第一个,第二个,倒数第二个.....”的形式,我们可以理解为把这个链表分成两个小链表进行交替链接,这两个小链表的长度之和就是这个大链表的长度,那么咋确定它们各自的长度呢?如果你不知道的话,那让我们来看看下面的这张图吧!奇数和偶数分别表示这个大链表的长度。

因为它们是交替进行的且已经确定了开始的位置,那么可以知道第一个小链表(灰色的)的个数总是 大于等于 第二个小链表(橙色的) ,按照规律我们可以通过计算得出第二个小链表的初始位置,同时把它们从第二个位置进行分割形成两个独立的链表,然后进行逆置第二个小链表,将第一个小链表和第二个小链表进行交替链接,这就是大概的思路。

第一步:将它分成两个链表

第二步:把第二个链表进行逆置

第三步:将这两个小链表进行交替链接,我采用哨兵位的头结点进行。

奇数:

偶数: 

 我这采用的是依据这个链表总的个数来判断循环结束的,同时依据奇偶来进行入第一个还是第二个小链表的数据,这个链接的过程就是单链表的尾部入数据的一个过程。

还有就是要考虑这个链表的节点的取值,如果是一个链表呢?那我们不用处理就行了。

三.总结

送自己一些话吧!写的时候尽可能的考虑周全一些仔细一些,这样就真的就少一些的bug和错误。

我上面写的可能有些方面不是很正确,如果哪些方面存在错误,还望指正!如果大家有更好的方法的话欢迎在评论区留言!!让我也学习学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值