Day6 代码随想录 刷题记录

总结:

今日刷题2道,用时3h15mins。对于链表判断的逻辑要加强,if与while的套循环要注意。

面试题 02.07. 链表相交

自己的想法:
将A链与B链分别移动到各自的链表的末尾,记录各自链表的长度,在此基础上两者长度相减的值即两者的长度差。

再让长的那个链先行移动长度差值,再一起移动直到找到彼此都相同的那个元素为止。

思路正确。

注意的点:

最后写的同时移动的判断逻辑写得有些问题,循环条件应该是while其中的某个指针不为NULL,终止的判断条件应该是p == q,而不是p != q,这样才能够得到相关的答案。

142.环形链表II

自己的想法:
直接按照遍历循环来找环的可能性,如果一直都没出现NULL的话就是有环。(?这个判断方式存疑)。找第一个入环的结点,是在遍历的时候的第一个重复出现的结点。

不对不对。

正确的做法:

设立快慢指针 轮流追赶 来判断链表有没有环。

快指针每次移动两个单位,慢指针每次移动一个单位。那么快指针指针就以相对速度为1在追赶慢指针,它们会在环里相遇。

慢指针一定在第一个圈中被快指针超越。根据这个数学关系可以列出等式。

难点:

1.快慢指针的相对运动。

2.快指针一定会在第一圈的时候就追上慢指针。

3.分析出快慢指针的关系,当它们第一次相遇的时候的位置 与从head起点出发的位置 移动相同的距离 可以得到环的入环位置。

注意:

1.找环形要建立在有环形的基础上。所以cur的判断条件是slow == fast时的值。

2.

        while(fast != NULL && fast -> next != NULL){//这里本身就包含了条件如果会出现NULL的话就是非环形链表

            fast = fast -> next -> next;//快指针一次移动两个单位

            slow = slow -> next;

        //找寻入口要建立在有环形的基础上

            if(slow == fast){

                cur1 = fast;

                cur2 = head;

            while(cur1 != cur2){

                cur1 = cur1 -> next;

                cur2 = cur2 -> next;

            }

            return cur1;

            }

        }

        return NULL;//直接返回

用一个大while包住相关的值,用if也包住下面的判断。

if包住下面的while判断代表这是函数找到的第一个相遇的点,保证在有环的情况下才执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值