1. 程式人生 > 資料庫 >Redis的sorted_set的用法,看完這一篇就夠了

Redis的sorted_set的用法,看完這一篇就夠了

25. K 個一組翻轉連結串列

Difficulty: 困難

給你一個連結串列,每_k_個節點一組進行翻轉,請你返回翻轉後的連結串列。

_k_是一個正整數,它的值小於或等於連結串列的長度。

如果節點總數不是_k_的整數倍,那麼請將最後剩餘的節點保持原有順序。

示例:

給你這個連結串列:1->2->3->4->5

當_k_= 2 時,應當返回: 2->1->4->3->5

當_k_= 3 時,應當返回: 3->2->1->4->5

說明:

  • 你的演算法只能使用常數的額外空間。
  • 你不能只是單純的改變節點內部的值,而是需要實際進行節點交換。

Solution

這道題目的難點在於題意的要求是區域性翻轉連結串列中的一部分而不是連結串列的整個部分,也就是翻轉完了連結串列的一個部分之後後續的還需要正常“接”回來,這道題區域性翻轉連結串列的操作也是LeetCode 143. 重排連結串列題的一個考點,如果之前做過這道題應該除錯幾下就能解出來。

# Definition for singly-linked list.
# class ListNode:
#   def __init__(self, val=0, next=None):
#     self.val = val
#     self.next = next
class Solution:
  def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
    if not head: return head
    
    slow = head
    i = 0
    while slow:
      slow = slow.next
      i += 1
      
    dummy = pre = ListNode(-1)
    pre.next = head
    t = i // k
    for i in range(t):
      mid = pre
      pCurrent = pre.next
      for _ in range(k-1):
        if pCurrent and pCurrent.next:
          current = pCurrent.next
          pCurrent.next = current.next
          current.next = mid.next
          mid.next = current
      pre = pCurrent
    return dummy.next