diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 290fd3cd..a172c90f 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -25,7 +25,7 @@ * [19. 正则表达式匹配](#19-正则表达式匹配) * [20. 表示数值的字符串](#20-表示数值的字符串) * [21. 调整数组顺序使奇数位于偶数前面](#21-调整数组顺序使奇数位于偶数前面) - * [22. 链表中倒数第 k 个结点](#22-链表中倒数第-k-个结点) + * [22. 链表中倒数第 K 个结点](#22-链表中倒数第-k-个结点) * [23. 链表中环的入口结点](#23-链表中环的入口结点) * [24. 反转链表](#24-反转链表) * [25. 合并两个排序的链表](#25-合并两个排序的链表) @@ -763,20 +763,26 @@ public void reOrderArray(int[] array) { } ``` -## 22. 链表中倒数第 k 个结点 +## 22. 链表中倒数第 K 个结点 + +**解题思路** + +设链表的长度为 N。设两个指针 P1 和 P2,先让 P1 移动 K 个节点,则还有 N - K 个节点可以移动。此时让 P1 和 P2 同时移动,可以知道当 P1 移动到链表结尾时,P2 移动到 N - K 个节点处,该位置就是倒数第 K 个节点。 + +

```java public ListNode FindKthToTail(ListNode head, int k) { if (head == null) return null; - ListNode fast, slow; - fast = slow = head; - while (fast != null && k-- > 0) fast = fast.next; + ListNode P1, P2; + P1 = P2 = head; + while (P1 != null && k-- > 0) P1 = P1.next; if (k > 0) return null; - while (fast != null) { - fast = fast.next; - slow = slow.next; + while (P1 != null) { + P1 = P1.next; + P2 = P2.next; } - return slow; + return P2; } ``` @@ -784,11 +790,11 @@ public ListNode FindKthToTail(ListNode head, int k) { **解题思路** -使用双指针,一个指针 fast 每次走两步,一个指针 slow 每次都一步。因为存在环,所以两个指针必定相遇在环中的某个节点上。此时 fast 走的路径长度为 x+2y+z,slow 走的路径长度为 x+y,由于 fast 速度比 slow 快一倍,因此 x+2y+z=2(x+y),得到 x=z。 +使用双指针,一个指针 fast 每次移动两个节点,一个指针 slow 每次移动一个节点。因为存在环,所以两个指针必定相遇在环中的某个节点上。此时 fast 移动的节点数为 x+2y+z,slow 为 x+y,由于 fast 速度比 slow 快一倍,因此 x+2y+z=2(x+y),得到 x=z。 -在相遇点,slow 要到环的入口点还需要走 z 长度,如果让 fast 重新从头开始走,并且速度变为每次走一步,那么它走到环入口点还需要走 x 长度。在上面已经推导出 x=z,因此 fast 和 slow 将在环入口点相遇。 +在相遇点,slow 要到环的入口点还需要移动 z 个节点,如果让 fast 重新从头开始移动,并且速度变为每次移动一个节点,那么它到环入口点还需要移动 x 个节点。在上面已经推导出 x=z,因此 fast 和 slow 将在环入口点相遇。 -

+

```java public ListNode EntryNodeOfLoop(ListNode pHead) { diff --git a/pics/40d96c0d-156f-4eee-a183-2d597344f1cd.png b/pics/40d96c0d-156f-4eee-a183-2d597344f1cd.png new file mode 100644 index 00000000..15f3819b Binary files /dev/null and b/pics/40d96c0d-156f-4eee-a183-2d597344f1cd.png differ diff --git a/pics/e7d7dc0d-fc22-4f95-8768-b8a216168792.jpg b/pics/e7d7dc0d-fc22-4f95-8768-b8a216168792.jpg new file mode 100644 index 00000000..5a7ea055 Binary files /dev/null and b/pics/e7d7dc0d-fc22-4f95-8768-b8a216168792.jpg differ