提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
24. 两两交换链表中的节点
● 今日学习的Leetcode链接
● 自己看到题目的第一想法
加一个头结点,两两交换
● 看完代码随想录之后的想法
一样
● 自己实现过程中遇到哪些困难
- 结束条件怎么写
- 假头结点是为了第一次交换方便
- 另一个新建的结点才是交换的关键
● 今日收获,记录一下自己的学习时长
思路都是对的,但是交换时有个细节错了,导致一直循环,对比了半天才找出来
public ListNode swapPairs(ListNode head) {
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;
ListNode temp = dummyHead ;
while(temp.next!=null && temp.next.next!=null){
ListNode node1 = temp .next;
ListNode node2= temp.next.next;
temp.next = node2;
node1.next = node2.next;
node2.next = node1 ;
temp = node1 ;
}
return dummyHead .next;
}
19. 删除链表的倒数第 N 个结点
● 今日学习的Leetcode链接
● 自己看到题目的第一想法
双指针,快指针移动一定次后,快慢指针一起移动
● 看完代码随想录之后的想法
解决方法很多
快慢指针它多加了一个假头结点,方便操作
● 自己实现过程中遇到哪些困难
没有加头结点,而且没有判断一种情况,当删除的正好是头结点时,此时right为null,应当直接返回head.next
● 今日收获,记录一下自己的学习时长
好
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode left = head;
ListNode right = head;
for(;n>0;n--){
right = right.next;
}
if(right==null){
return left.next;
}
while(right.next!=null){
right = right.next;
left = left.next;
}
left.next = left.next.next;
return head;
}
面试题 02.07. 链表相交
● 今日学习的Leetcode链接
● 自己看到题目的第一想法
让走完一遍的指针再去走另一边的,直到两指针相交
● 看完代码随想录之后的想法
一样
● 自己实现过程中遇到哪些困难
不需要计数器
如果两者没有交点,走完a+b的步数后,两者都是null,也就是不管是空还是有交点,只要a==b就时返回结果。
跳转时,判断当前是不是null,而不是判断next是不是null (上一步的前提)
如果确定两者都不是一起为null;就可以跳转了,而且跳转一次就可以。
● 今日收获,记录一下自己的学习时长
很好
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode a = headA;
ListNode b = headB;
if(a== null || b==null){
return null;
}
while(a!=b){
a = a.next;
b = b.next;
if(a==null && b==null){
return null;
}
if(a == null){
a = headB;
}
if(b == null ){
b = headA;
}
}
return a;
}
142. 环形链表 II
● 今日学习的Leetcode链接
● 自己看到题目的第一想法
没有想法
● 看完代码随想录之后的想法
快慢指针
1.判断是否有环
让快指针走两步,慢指针走一步,让快指针去追赶慢指针,如果两者相遇,就是有环
x+y 肯定是 <= x+y+z,而且肯定在慢指针第一圈结束之前(包括结束时)相遇。
2.有环的话入环点在哪
快慢指针相遇后。再有两个点分别从交点和起点出发,两者一起移动一步,两者再相交时,就是入环点。
x=(n-1)(y+z)+z(n>=1) 转n圈后相遇,不可能一圈不转就相遇
y+z是环的一圈
(n-1)(y+z)是>=0的,x大于等于z
也就是指针1走x步,一定会与指针2相遇。
其实是求的x,但是不知道几,z也不知道是几。但是用两者的数学关系:两者会相遇,相遇时,即得到x
● 自己实现过程中遇到哪些困难
好吧,我直接看得代码
● 今日收获,记录一下自己的学习时长
very good 数学知识很重要啊,同志们
public ListNode detectCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast!=null&&fast.next!=null){
fast = fast.next.next;
slow = slow.next;
if(slow == fast){
ListNode l1 = head;
ListNode l2 = fast;
while(l1!=l2){
l1 = l1.next;
l2 = l2.next;
}
return l1;
}
}
return null;
}