- [[24. Swap Nodes in Pairs]]
- 比较简单,用了不同的顺序(temp = cur.next 以及 temp = cur.next.next)
- [[19. Remove Nth Node From End of List]]
- 比较简单
- [[面试题 02.07. 链表相交]]
- 思路
- 如果不相交
- curA遍历完A之后遍历B
- curB遍历完B之后遍历A
- A + B =B+ A ,无论curA,curB遍历的长度都是相等的,最后在curA == curB = null时跳出循环
- 如果相交
- 类似于快慢指针找确认循环,只要相交,终究会在交点相遇
- 如果不相交
-
//java public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode curA = headA; ListNode curB = headB; while (curA != curB){ curA = curA == null ? headB : curA.next; curB = curB == null ? headA : curB.next; } return curA; } } //当然也可以 HashSet public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode curA = headA; ListNode curB = headB; Set<ListNode> set = new HashSet<>(); while(curA != null){ set.add(curA); curA =curA.next; } while(curB != null){ if(set.contains(curB)){ return curB; } curB = curB.next; } return null; } }
- 思路
- [[142. Linked List Cycle II]]
- 思路
- 由图可知 第一次相遇时
- 对于slow的位移= F+a
- 对于fast的位移= F+a+nC (n为常数, C=a+b,就是绕了几圈)
- slow的位移/fast的位移 = 1/2
- 2(F+a)= F+a+nC
- F+a =nC
- F= nC-(C-b)
- F= (n-1)+b
- 所以:一个点从第一次相遇的h点()出发,另一个点从head出发,最终能在cycle entrance相遇
- F= (n-1)+b
- F= nC-(C-b)
- F+a =nC
- 2(F+a)= F+a+nC
- slow的位移/fast的位移 = 1/2
- 这个方法如果先判断再移动指针可能会超时
- Time Complexity On
- HashSet 方法贼简单
-
//java public class Solution { public ListNode detectCycle(ListNode head) { Set set = new HashSet(); ListNode cur = head; while(cur != null){ if(set.contains(cur)){ return cur; } set.add(cur); cur = cur.next; } return null; } }
-
- 由图可知 第一次相遇时
- 思路
代码随想录算法训练营第四天| 24. 两两交换链表中的节点 , 19.删除链表的倒数第N个节点 , 面试题 02.07. 链表相交, 142.环形链表II
于 2022-10-29 14:42:16 首次发布