当前位置:   article > 正文

leetcode算法面试题:给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表_给你一个链表,每k个节点一组进行翻转

给你一个链表,每k个节点一组进行翻转

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

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

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

进阶:

  • 你可以设计一个只使用常数额外空间的算法来解决此问题吗?

  • 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

提示:

  • 列表中节点的数量在范围 sz 内

  • 1 <= sz <= 5000

  • 0 <= Node.val <= 1000

  • 1 <= k <= sz

参考答案

  1. class Solution {
  2. public:
  3. // 翻转一个子链表,并且返回新的头与尾
  4. pair<ListNode*, ListNode*> myReverse(ListNode* head, ListNode* tail) {
  5. ListNode* prev = tail->next;
  6. ListNode* p = head;
  7. while (prev != tail) {
  8. ListNode* nex = p->next;
  9. p->next = prev;
  10. prev = p;
  11. p = nex;
  12. }
  13. return {tail, head};
  14. }
  15. ListNode* reverseKGroup(ListNode* head, int k) {
  16. ListNode* hair = new ListNode(0);
  17. hair->next = head;
  18. ListNode* pre = hair;
  19. while (head) {
  20. ListNode* tail = pre;
  21. // 查看剩余部分长度是否大于等于 k
  22. for (int i = 0; i < k; ++i) {
  23. tail = tail->next;
  24. if (!tail) {
  25. return hair->next;
  26. }
  27. }
  28. ListNode* nex = tail->next;
  29. // 这里是 C++17 的写法,也可以写成
  30. // pair<ListNode*, ListNode*> result = myReverse(head, tail);
  31. // head = result.first;
  32. // tail = result.second;
  33. tie(head, tail) = myReverse(head, tail);
  34. // 把子链表重新接回原链表
  35. pre->next = head;
  36. tail->next = nex;
  37. pre = tail;
  38. head = tail->next;
  39. }
  40. return hair->next;
  41. }
  42. };

题目:实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000

示例 2:

输入:x = 2.10000, n = 3
输出:9.26100

示例 3:

输入:x = 2.00000, n = -2
输出:0.25000

 

参考答案

  1. class Solution {
  2. public:
  3. double quickMul(double x, long long N) {
  4. if (N == 0) {
  5. return 1.0;
  6. }
  7. double y = quickMul(x, N / 2);
  8. return N % 2 == 0 ? y * y : y * y * x;
  9. }
  10. double myPow(double x, int n) {
  11. long long N = n;
  12. return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
  13. }
  14. };

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

闽ICP备14008679号