|
14 | 14 | <!-- - 分离双指针 |
15 | 15 | - 输入是两个数组/链表,两个指针分别在两个容器中移动 --> |
16 | 16 |
|
| 17 | +RoadMap |
| 18 | +--- |
| 19 | +- [首尾双指针](#首尾双指针) |
| 20 | +- [同向双指针](#同向双指针) |
| 21 | +- [链表](#链表) |
| 22 | +- [其他](#其他) |
| 23 | + |
17 | 24 | Index |
18 | 25 | --- |
19 | 26 | <!-- TOC --> |
|
34 | 41 | - [长度最小的子数组(Minimum Size Subarray Sum)](#长度最小的子数组minimum-size-subarray-sum) |
35 | 42 | - [无重复字符的最长子串(Longest Substring Without Repeating Characters)](#无重复字符的最长子串longest-substring-without-repeating-characters) |
36 | 43 | - [水果成篮(Fruit Into Baskets)](#水果成篮fruit-into-baskets) |
| 44 | +- [链表](#链表) |
| 45 | + - [旋转链表](#旋转链表) |
37 | 46 | - [其他](#其他) |
38 | 47 | - [数组中的最长山脉(Longest Mountain in Array)](#数组中的最长山脉longest-mountain-in-array) |
39 | 48 | - [合并两个有序数组(Merge Sorted Array)](#合并两个有序数组merge-sorted-array) |
@@ -885,6 +894,116 @@ class Solution: |
885 | 894 | ``` |
886 | 895 |
|
887 | 896 |
|
| 897 | +# 链表 |
| 898 | + |
| 899 | +## 旋转链表 |
| 900 | +> LeetCode/[61. 旋转链表](https://leetcode-cn.com/problems/rotate-list/description/) |
| 901 | +
|
| 902 | +**问题描述** |
| 903 | +``` |
| 904 | +给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。 |
| 905 | +
|
| 906 | +示例 1: |
| 907 | + 输入: 1->2->3->4->5->NULL, k = 2 |
| 908 | + 输出: 4->5->1->2->3->NULL |
| 909 | + 解释: |
| 910 | + 向右旋转 1 步: 5->1->2->3->4->NULL |
| 911 | + 向右旋转 2 步: 4->5->1->2->3->NULL |
| 912 | +示例 2: |
| 913 | + 输入: 0->1->2->NULL, k = 4 |
| 914 | + 输出: 2->0->1->NULL |
| 915 | + 解释: |
| 916 | + 向右旋转 1 步: 2->0->1->NULL |
| 917 | + 向右旋转 2 步: 1->2->0->NULL |
| 918 | + 向右旋转 3 步: 0->1->2->NULL |
| 919 | + 向右旋转 4 步: 2->0->1->NULL |
| 920 | +``` |
| 921 | + |
| 922 | +**思路** |
| 923 | +- 双指针 `l, r` 记录两个位置,其中 `l` 指向倒数第 `k+1` 个节点,`r` 指向最后一个非空节点; |
| 924 | +- 然后将 `r` 指向头结点 `h`,`h` 指向 `l` 的下一个节点,最后断开 `l` 与下一个节点; |
| 925 | +- 注意 `k` 可能大于链表的长度,此时可能需要遍历两次链表 |
| 926 | + |
| 927 | +**代码 1** |
| 928 | +- 比较直观的写法,代码量稍大 |
| 929 | +```python |
| 930 | +# class ListNode: |
| 931 | +# def __init__(self, x): |
| 932 | +# self.val = x |
| 933 | +# self.next = None |
| 934 | + |
| 935 | +class Solution: |
| 936 | + def rotateRight(self, h, k): |
| 937 | + """ |
| 938 | + :type h: ListNode |
| 939 | + :type k: int |
| 940 | + :rtype: ListNode |
| 941 | + """ |
| 942 | + if not h or k == 0: |
| 943 | + return h |
| 944 | + |
| 945 | + n = 1 # 记录链表的长度,因为只遍历到最后一个非空节点,所以从 1 开始 |
| 946 | + l = h |
| 947 | + r = h # tail |
| 948 | + while r.next is not None and k > 0: |
| 949 | + k -= 1 |
| 950 | + n += 1 |
| 951 | + r = r.next |
| 952 | + |
| 953 | + # print(k, n) |
| 954 | + if k > 0: |
| 955 | + k -= 1 # 这里要先减 1,因为 n 是从 1 开始计数的 |
| 956 | + k = k % n |
| 957 | + r = h |
| 958 | + while k > 0: |
| 959 | + k -= 1 |
| 960 | + r = r.next |
| 961 | + |
| 962 | + # 找到倒数第 k 个节点 |
| 963 | + while r.next is not None: |
| 964 | + l = l.next |
| 965 | + r = r.next |
| 966 | + |
| 967 | + r.next = h |
| 968 | + h = l.next |
| 969 | + l.next = None |
| 970 | + |
| 971 | + return h |
| 972 | +``` |
| 973 | + |
| 974 | +**代码 2** |
| 975 | +```python |
| 976 | +class Solution: |
| 977 | + def rotateRight(self, h, k): |
| 978 | + """ |
| 979 | + :type h: ListNode |
| 980 | + :type k: int |
| 981 | + :rtype: ListNode |
| 982 | + """ |
| 983 | + if not h or k == 0: |
| 984 | + return h |
| 985 | + |
| 986 | + n = 1 # 记录链表的长度,因为只遍历到最后一个非空节点,所以从 1 开始 |
| 987 | + r = h # tail |
| 988 | + while r.next is not None: |
| 989 | + n += 1 |
| 990 | + r = r.next |
| 991 | + |
| 992 | + r.next = h # 构成环 |
| 993 | + |
| 994 | + k %= n |
| 995 | + t = n - k |
| 996 | + while t > 0: |
| 997 | + r = r.next |
| 998 | + t -= 1 |
| 999 | + |
| 1000 | + h = r.next |
| 1001 | + r.next = None # 断开 链表 |
| 1002 | + |
| 1003 | + return h |
| 1004 | +``` |
| 1005 | + |
| 1006 | + |
888 | 1007 | # 其他 |
889 | 1008 |
|
890 | 1009 | ## 数组中的最长山脉(Longest Mountain in Array) |
|
0 commit comments