目录
- 题目描述
- 解法
- 运行结果
题目描述
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
示例 1:
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
示例 2:
输入:head = [0,1,2], k = 4
输出:[2,0,1]
提示:
- 链表中节点的数目在范围 [0, 500] 内
- -100 <= Node.val <= 100
- 0 <= k <= 2 * 109
解法
快慢指针 + 链表拼接
我们先判断链表节点数是否小于 2,如果是,直接返回 head 即可。
否则,我们先统计链表节点数 n,然后将 k 对 n 取模,得到 k 的有效值。
如果 k 的有效值为 0,说明链表不需要旋转,直接返回 head 即可。
否则,我们用快慢指针,让快指针先走 k 步,然后快慢指针同时走,直到快指针走到链表尾部,此时慢指针的下一个节点就是新的链表头节点。
最后,我们将链表拼接起来即可。
时间复杂度 O(n),其中 n 是链表节点数,空间复杂度 O(1)。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):def rotateRight(self, head, k):""":type head: ListNode:type k: int:rtype: ListNode"""if head is None or head.next is None:return headcur, n = head, 0while cur:n += 1cur = cur.nextk %= nif k == 0:return headfast = slow = headfor _ in range(k):fast = fast.nextwhile fast.next:fast, slow = fast.next, slow.nextans = slow.nextslow.next = Nonefast.next = headreturn ans