Prenez l'habitude d'écrire ensemble ! C'est le 10ème jour de ma participation au "Nuggets Daily New Plan · April Update Challenge", cliquez pour voir les détails de l'événement .
décrire
Étant donné l'en-tête d'une liste chaînée simple et deux entiers gauche et droite où gauche <= droite, inversez les nœuds de la liste de la position gauche à la position droite et renvoyez la liste inversée.
Suivi : Pourriez-vous le faire en un seul passage ?
Exemple 1:
Input: head = [1,2,3,4,5], left = 2, right = 4
Output: [1,4,3,2,5]
复制代码
Exemple 2 :
Input: head = [5], left = 1, right = 1
Output: [5]
复制代码
Noter:
The number of nodes in the list is n.
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
复制代码
Analyser
Selon la signification du titre, étant donné la tête d'une liste chaînée simple et deux entiers gauche et droite, où gauche <= droite, inversez les nœuds de la liste de la position gauche à la position droite, et retournez la liste inversée. Le sujet met également en avant des exigences plus élevées pour les étudiants capables, s'il peut être complété en une seule fois.
Cette question consiste à examiner les opérations de base telles que l'inversion, l'épissage et le parcours de listes chaînées. Si nous sommes dans la concurrence, nous voyons que la limite du nombre de nœuds et de valeurs de nœud est très petite, nous stockons donc directement toutes les valeurs de nœud dans la liste. , puis inversez les valeurs dans [gauche, droite], puis parcourez les valeurs de la liste, en les épissant dans une nouvelle liste liée.
Cependant, cette méthode est plus opportuniste et elle expirera ou utilisera trop de mémoire pour une liste chaînée avec un grand nombre de nœuds. Par conséquent, l'obligation de convertir cette liste chaînée en un seul parcours est proposée dans le titre.
répondre
class ListNode(object):
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution(object):
def reverseBetween(self, head, left, right):
if not head or not head.next: return head
values = []
while head:
values.append(head.val)
head = head.next
result = dummy = ListNode(0)
values[left-1:right] = values[left-1:right][::-1]
for v in values:
result.next = ListNode(val=v)
result = result.next
return dummy.next
复制代码
résultat de l'opération
Runtime: 20 ms, faster than 66.00% of Python online submissions for Reverse Linked List II.
Memory Usage: 13.7 MB, less than 35.28% of Python online submissions for Reverse Linked List II.
复制代码
Analyser
Bien sûr, vous pouvez également remplir les exigences de la tâche de titre en une seule traversée. L'idée est relativement simple, c'est-à-dire qu'en parcourant la liste chaînée, la liste chaînée est coupée en trois parties selon la gauche et la droite. La partie [gauche, droite] appartient à la deuxième partie, puis tout en traversant les nœuds dans la plage de [gauche, droite], inversez les nœuds dans cette plage. Lorsque vous traversez jusqu'à la fin de la droite, vous n'avez qu'à épisser et en inversant la première partie de la deuxième partie réussie, et la deuxième partie de l'épissage est laissée. La troisième partie de , vous pouvez obtenir le résultat final de la liste chaînée.
répondre
class ListNode(object):
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution(object):
def reverseBetween(self, head, left, right):
"""
:type head: ListNode
:type left: int
:type right: int
:rtype: ListNode
"""
if not head or not head.next: return head
result = dummy = ListNode(-1000)
dummy.next = head
for _ in range(left-1):
dummy = dummy.next
endOfFirst = dummy
dummy = dummy.next
startOfSecond = dummy
last = None
for _ in range(left, right+1):
nxt = dummy.next
dummy.next = last
last = dummy
dummy = nxt
endOfFirst.next = last
startOfSecond.next = dummy
return result.next
复制代码
résultat de l'opération
Runtime: 24 ms, faster than 36.42% of Python online submissions for Reverse Linked List II.
Memory Usage: 13.7 MB, less than 64.15% of Python online submissions for Reverse Linked List II.
复制代码
Lien du titre original : leetcode.com/problems/re…
Votre soutien est ma plus grande motivation