leetcode 92.逆リンクリストII(python)

一緒に書く習慣をつけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して10日目です。クリックしてイベントの詳細をご覧ください

説明

単一リンクリストの先頭と、左右に2つの整数があり、左<=右の場合、リストのノードを左の位置から右の位置に反転し、反転したリストを返します。

フォローアップ:1回のパスでそれを行うことができますか?

例1:

Input: head = [1,2,3,4,5], left = 2, right = 4
Output: [1,4,3,2,5]
复制代码

例2:

Input: head = [5], left = 1, right = 1
Output: [5]
复制代码

ノート:

The number of nodes in the list is n.
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
复制代码

解析

タイトルの意味に従って、単一リンクリストの先頭と左右に2つの整数(左<=右)を指定して、リストのノードを左の位置から右の位置に反転し、反転したリストを返します。トピックはまた、それが一度に完了することができるかどうかにかかわらず、有能な学生のためのより高い要件を提唱します。

この質問は、リンクリストの反転、スプライシング、トラバーサルなどの基本的な操作を調べることです。競合他社の場合、ノード数とノード値の制限が非常に小さいことがわかるため、直接保存します。リスト内のすべてのノード値。次に、[左、右]の値を反転し、リスト内の値をトラバースして、新しいリンクリストに接続します。

ただし、この方法はより適切であり、ノード数が多いリンクリストではタイムアウトになるか、メモリを大量に使用します。したがって、このリンクリストを1回のトラバーサルで変換する要件がタイトルで提案されています。

答え

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

        	      
		
复制代码

運転結果

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.
复制代码

解析

もちろん、1回のトラバーサルでタイトルタスクの要件を完了することもできます。アイデアは比較的単純です。つまり、リンクリストをトラバースする過程で、リンクリストは左右に応じて3つの部分に分割されます。 [左、右]の部分は2番目の部分に属し、[左、右]の範囲のノードをトラバースしているときに、この範囲のノードを反転します。右の端までトラバースする場合は、スプライシングと成功した2番目の部分の最初の部分を反転し、スプライシングの2番目の部分を残します。の3番目の部分では、最終的なリンクリストの結果を取得できます。

答え

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
        
复制代码

運転結果

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.
复制代码

元のタイトルリンク:leetcode.com/problems/re…

あなたのサポートは私の最大の動機です

おすすめ

転載: juejin.im/post/7084795194565984293