問題
原文
Given the
head
of a linked list, rotate the list to the right byk
places.
Example 1:
12 Input: head = [1,2,3,4,5], k = 2Output: [4,5,1,2,3]Example 2:
12 Input: head = [0,1,2], k = 4Output: [2,0,1]
Constraints:
- The number of nodes in the list is in the range
[0, 500]
.-100 <= Node.val <= 100
0 <= k <= 2 * 109
内容
連結リストheadが与えられるので、k回だけ右回転で回転させてください。
制約
・リスト内のノードの数は0~500
・ノードの値は-100~100
・kは0~2*10^9
※正しくない可能性があります。
方針
・循環リストにする
・新しい末尾と先頭を取得する
・新たな先頭から新たな2番目の要素へのポインタを
・新たな末尾から新たな先頭へのポインタを切る
解答
解答1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]: if not head: return head current = head length = 1 #先頭から辿って末尾のポインタの値(val)を取得 while current.next: current = current.next #遷移した数を記録 length += 1 #末尾のポインタのnextに先頭の値を保持することで循環リストを作成 current.next = head #新しいheadに移動:例1では4-(2%4)=2 ※kはrotationの回数 k = length - (k%length) #rotationの回数(k)だけポインタを下げた後に指す要素が新たな末尾となる while k>0: #新たな末尾のポインタへ先頭から辿って遷移 current = current.next k -= 1 #新たな先頭を作成してheadを返す #末尾の要素の次が新たな先頭になるのでcurrent(末尾)のnextをnewheadに保持 newhead = current.next #末尾のnextはNoneに変更 current.next = None return newhead |
補足・参考・感想
参考
コメント