こんにちは
今回の学びは
・math.ceil使わずにn//2 if n%2==0 else n//2+1をつかったよ
・linked listの操作は配列記憶が吉かも。(前回19 remove nth from endとう問題でもつかえたろうから)
問題は。。。
(時間配分は5分問題理解 10分検討 10分実装 20分振り返り の一文45分構成)
まずは入出力をしっかりおさえましょう。
リンクリストの並べ替え問題
これ実際に30分で解けと言われると、結構実装ではまりそう。。。
しかもデバッガーが使えない状態でと考えると
シッカリ頭とペンで描くことが大事とみた。
実装前後でこれは毎回書きましょう。timespace analysis (時間とスペースの分析)は O(n)
実際の実装はこちら
class Solution:
def reorderList(self, head: ListNode) -> None:
"""
Do not return anything, modify head in-place instead.
1->2->3->4
1, 4, 2, 3
1->2->3->4->5
1, 5, 2, 4, 3
"""
curr = head
sz = 0
array = []
while curr:
sz += 1
array.append(curr)
curr = curr.next
curr = head
stop = sz//2 if sz % 2 == 0 else (sz//2)+1
print("sz:%s, stop:%s" % (sz, stop))
if sz == 1: return head
for i in range(stop):
print("i:%s" % i)
left = array[i]
right = array[sz-1-i]
right.next = left.next
left.next = right
if sz % 2 == 0:
if 0 <= stop < sz:
array[stop].next = None
else:
if 0 <= stop < sz:
array[stop-1].next = None
return head
実装後です。timespace analysis (時間とスペースの分析)は O(N)
以前、勉強した
・math.ceil使わずにn//2 if n%2==0 else n//2+1をつかったよ。(他事例rotate image)
をいきなり使いこなしたよ。good

まとめ
・math.ceil使わずにn//2 if n%2==0 else n//2+1をつかったよ
・linked listの操作は配列記憶が吉かも。(前回19 remove nth from endとう問題でもつかえたろうから)
以上です