总结:
今日刷题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判断代表这是函数找到的第一个相遇的点,保证在有环的情况下才执行。