一緒に書く習慣をつけましょう!「ナゲッツデイリーニュープラン・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…
あなたのサポートは私の最大の動機です