力扣解题小思-3

今天依旧来力扣解题,这次要研究的是关于链表的题目。什么是链表呢,说实话一开始其实对这个东西没有什么印象,也是在后面学习结构体的时候才慢慢接触到的。而什么是结构体呢,简单来说就是一种数据类型,但是并不像一般的类型,其中只包含一个数据,而是同时包含多个数据,这些数据可以是同一类型的,也可以是不同类型,而这些数据复合而成就成为了结构体。而链表又是由一种特殊的结构体构成的,构成链表的单体叫做节点,是一种特殊的结构体,在这个结构体中除了储存的数据还有可以指向相同结构体的指针,而这个指针就是用来指向下一个节点的,所以链表中的节点是有一定的指向关系的,同时这种指向关系也代表了链表内部数据的关系,从而将单个的节点集合成一个整体。但是其实一直都没有机会能见识到这种结构数据的应用,而这一题又是使用到了链表的知识所以就来看一下到底是怎样使用这个工具的。
题目的名字叫做相交链表,为什么是相交链表呢,这其实就是关系到这个题目性质的问题了,先来看一下是怎么描述的。题目中说到,要给出两个单链表的头节点,这里说的节点就是前面提到的特殊的结构体,这是两个单链表,所以给出的其实就是两个特殊结构体。这里同样是给出了一个函数结构,其中函数名以及函数的参数都有,而函数内部的代码是需要自己来填充的。一开始我还没有意识到,然后看了一下题目的提示,发现这里其实是先对结构体进行了定义的,也就是说因为结构体这种数据类型是需要提前定义的,之后才能进行使用,所以说要先看一下这里的结构体定义,代码如下。
struct ListNote
{
int val;
struct ListNote *next;
}
这里可以看到这个结构体类型的名称是ListNote,而如果要定义一个该结构体类型的变量的话,就需要用关键字struct加上ListNote作为变量类型名,再来看一下这个结构体的元素构成,其中有一个名为val的整型变量,还有一个指向这个定义的结构体的指针,其实有点嵌套的意思,但是这里定义的是指针,所以并不是标准的嵌套。不过要清楚这里的指针是作为和其他节点连接的重要部分,是链表节点不可缺少的部分,然后这个指针名为next说明指向的是下一个节点,而且说明构成的链表是单向链表,下面我们再来看一下函数的相关信息是什么,函数类型是指向该结构体类型的指针,为struct ListNote *getIntersectionNote,所以说函数名是getIntersectionNote,而这个函数返回值为指向结构体的指针,这一点要注意,然后再看一下函数的输入是什么,有两个参数,分别为struct ListNote *headA和structListNote *headB,也就是两个指向结构体的指针,其实这也就意味着通过这两个指针可以得到其指向的链表节点,从而得到整个链表数据,但具体如何实现需要再进行考虑。
这个题目的要点就是在于如何找到两个单向链表的交叉节点,而这里其实未知的信息有很多,比如说两个单链表的长度是多少,以及如何判断节点是相交的节点,如果通过节点中的数值其实并不是很准确,因为不同的节点其数值也可以是相同的,那么就需要通过比较指向节点的指针是否相同来判断,因为指向节点的指针其实就是表示地址,如果地址相同的话那么就说明表示的是同一个节点。那又应该如何得到链表的不同节点的指针呢,是要先定义变量还是说通过表示第几个的变量来进行表示。查找了资料,说是可以通过定义指针的方式进行遍历,这样的话,如果我们要知道某个链表是不是有某一个节点,其实就可以用遍历的方式进行查找,而如果是要判断两个单向链表是不是有相同的节点,也可以用遍历的方法,而这是可以用嵌套的方法来实现。也就是说先遍历第一个单向链表,在遍历的过程中通过遍历的方法去寻找第二个单向链表中是否有符合条件的节点,如果有点话就返回,如果没有的话那就继续遍历,这个方法应该是行得通的。
这里简单讲一下如何对一个单向链表进行遍历的操作,因为这是这个操作其实就是完成题目要求重要的一个步骤。首先第一步就是要定义一个相同类型的指针,这个指针是可以变化的,所以可以给出链表中的元素组成,可以设置为Current。然后是一个循环语句,这里可以用while循环,其中条件设置为Current不为空指针,也就是说一直进行到单向链表的最后。在循环体中,首先是对当前节点进行的一些操作,当进行完操作之后,就可以将指针变换为下一个节点的指针,这里需要通过赋值的方式实现。
然后这里我给出的解决方法就是,通过两个while循环,分别对两个单链表进行遍历,外边的循环是针对第一个链表的,而里面的循环是针对于第二个链表的,于是这里需要定义两个指针,分别对应第一个和第二个链表,然后在内循环中判断两个指针是否相同,如果相同那么就跳出循环,并输出指针,如果不相等,那么在内循环中要进行指针的变换,同时在外循环中也要进行指针的变换,在外循环中也好进行条件判断,然后跳出循环,那么整个函数就完成,但是我并不知道这种到底能不能成功。
经过一些修改也算是成功了,其中犯了一个小错误,就是在每一次内循环结束后,需要将第二个链表的指针进行初始化,不然的话该指针就会一直停留在上一次循环的最后,这样的话就无法达到每一次循环都是遍历的效果,最后修改完之后也是成功实现。但是从表现上来看运行时间上比较长,然后运行内存也不是很好,所以的话还是有不小的提升空间的,但是总算是能够运行了,说明这种思路还是可行的,也就是说通过寻找指针的方法是可行的。

posted @ 2026-03-29 17:07  getacat  阅读(0)  评论(0)    收藏  举报