Skip to content

Commit b368802

Browse files
committed
【update】专题-双指针
1 parent cc806da commit b368802

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed

C-算法/专题-B-双指针.md

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@
1414
<!-- - 分离双指针
1515
- 输入是两个数组/链表,两个指针分别在两个容器中移动 -->
1616

17+
RoadMap
18+
---
19+
- [首尾双指针](#首尾双指针)
20+
- [同向双指针](#同向双指针)
21+
- [链表](#链表)
22+
- [其他](#其他)
23+
1724
Index
1825
---
1926
<!-- TOC -->
@@ -34,6 +41,8 @@ Index
3441
- [长度最小的子数组(Minimum Size Subarray Sum)](#长度最小的子数组minimum-size-subarray-sum)
3542
- [无重复字符的最长子串(Longest Substring Without Repeating Characters)](#无重复字符的最长子串longest-substring-without-repeating-characters)
3643
- [水果成篮(Fruit Into Baskets)](#水果成篮fruit-into-baskets)
44+
- [链表](#链表)
45+
- [旋转链表](#旋转链表)
3746
- [其他](#其他)
3847
- [数组中的最长山脉(Longest Mountain in Array)](#数组中的最长山脉longest-mountain-in-array)
3948
- [合并两个有序数组(Merge Sorted Array)](#合并两个有序数组merge-sorted-array)
@@ -885,6 +894,116 @@ class Solution:
885894
```
886895

887896

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+
8881007
# 其他
8891008

8901009
## 数组中的最长山脉(Longest Mountain in Array)

0 commit comments

Comments
 (0)