难度: Medium
原题连接
内容描述
Given a linked list, rotate the list to the right by k places, where k is non-negative.
Example 1:
Input: 1->2->3->4->5->NULL, k = 2
Output: 4->5->1->2->3->NULL
Explanation:
rotate 1 steps to the right: 5->1->2->3->4->NULL
rotate 2 steps to the right: 4->5->1->2->3->NULL
Example 2:
Input: 0->1->2->NULL, k = 4
Output: 2->0->1->NULL
Explanation:
rotate 1 steps to the right: 2->0->1->NULL
rotate 2 steps to the right: 1->2->0->NULL
rotate 3 steps to the right: 0->1->2->NULL
rotate 4 steps to the right: 2->0->1->NULL
思路 1 - 时间复杂度: O(N)- 空间复杂度: O(N)******
无脑存点, k可能比list的size大,需要做一个取余准备
class Solution:
def rotateRight(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
if not head or k == 0:
return head
nodes = []
while head:
nodes.append(head)
head = head.next
k = k % len(nodes)
if k == 0:
return nodes[0]
nodes[-k-1].next = None
nodes[-1].next = nodes[0]
return nodes[-k]
思路 2 - 时间复杂度: O(N)- 空间复杂度: O(1)******
- k可能比list的size大,需要做一个取余准备
- 计算list size的同时把tail也记录下来,方便之后把tail的next指向原本的head
- 利用之前的到末端的kth node
class Solution:
def rotateRight(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
if not head or k == 0:
return head
size = 0
cur = tail = head
while cur:
size += 1
tail = cur
cur = cur.next
k = k % size
if k == 0:
return head
tmp = self.findLastKth(head, k, size)
last_kth = tmp.next
tmp.next = None
tail.next = head
return last_kth
def findLastKth(self, node, k, size):
for i in range(size - k - 1):
node = node.next
return node
findLastKth函数也可以用双指针概念,先让一个指针走k步
class Solution:
def rotateRight(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
if not head or k == 0:
return head
size = 0
cur = tail = head
while cur:
size += 1
tail = cur
cur = cur.next
k = k % size
if k == 0:
return head
tmp = self.findLastKth(head, k)
last_kth = tmp.next
tmp.next = None
tail.next = head
return last_kth
def findLastKth(self, node, k):
fast = slow = node
for i in range(k+1):
fast = fast.next
while fast:
slow = slow.next
fast = fast.next
return slow