当前位置:   article > 正文

K 个一组翻转链表--python_k个一组翻转链表python

k个一组翻转链表python

25. K 个一组翻转链表icon-default.png?t=LA92https://leetcode-cn.com/problems/reverse-nodes-in-k-group/

难度困难1389

给你一个链表,每 个节点一组进行翻转,请你返回翻转后的链表。

是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 的整数倍,那么请将最后剩余的节点保持原有顺序。

进阶:

  • 你可以设计一个只使用常数额外空间的算法来解决此问题吗?
  • 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

示例 2:

输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]

示例 3:

输入:head = [1,2,3,4,5], k = 1
输出:[1,2,3,4,5]

示例 4:

输入:head = [1], k = 1
输出:[1]

提示:

  • 列表中节点的数量在范围 sz 内
  • 1 <= sz <= 5000
  • 0 <= Node.val <= 1000
  • 1 <= k <= sz

通过次数251,208提交次数381,729

解题思路 

  1. 最外层循环的次数可以通过计算链表长度来得出。
  2. 内层如上图,利用p_turn来遍历后面的列表,更具k来决定将p_turn后面结点插入头结点次数
  3. 为了下一次的外层循环做准备,以p_turn为头结点,后面重复操作 2

 我的代码

  1. # Definition for singly-linked list.
  2. # class ListNode:
  3. # def __init__(self, val=0, next=None):
  4. # self.val = val
  5. # self.next = next
  6. class Solution:
  7. def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
  8. p_turn_pre = ListNode(0, head)
  9. p_result = p_turn_pre
  10. p_len = 0
  11. result = head
  12. while result:
  13. p_len += 1
  14. result = result.next
  15. n = int (p_len/k)
  16. #print('n',n)
  17. while n:
  18. n -= 1
  19. #开始一轮转置
  20. p_turn = p_turn_pre.next #首先先移动一个指针的位置
  21. for i in range(k-1):
  22. if p_turn.next:
  23. #print('i', i)
  24. p_t = p_turn.next
  25. p_turn.next = p_t.next
  26. p_t.next = p_turn_pre.next
  27. p_turn_pre.next = p_t
  28. #print('p_t', p_t.val)
  29. p_turn_pre = p_turn
  30. return p_result.next

时空复杂度分析

时间复杂度:对于链表只遍历了一次,O(n)

空间复杂度:没有再使用其他数组,在原本的链表上操作,O(n)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/80036
推荐阅读
相关标签
  

闽ICP备14008679号