leetcode 92. Liste chaînée inverse II (python)

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

Je suppose que tu aimes

Origine juejin.im/post/7084795194565984293
conseillé
Classement