当前位置:   article > 正文

重排链表 刷题

重排链表 刷题

力扣刷题

 

方法一 放入容器vector 然后访问下标去进行编写

  1.  class Solution {
  2.  public:
  3.      void reorderList(ListNode* head) {
  4.          if (head == nullptr) {
  5.              return;
  6.         }
  7.          vector<ListNode*> vec;
  8.          ListNode* node = head;
  9.          while (node != nullptr) {
  10.              vec.emplace_back(node);
  11.              node = node->next;
  12.         }
  13.          int i = 0, j = vec.size() - 1;
  14.          while (i < j) {
  15.              vec[i]->next = vec[j];
  16.              i++;
  17.              if (i == j) {
  18.                  break;
  19.             }
  20.              vec[j]->next = vec[i];
  21.              j--;
  22.         }
  23.          vec[i]->next = nullptr;
  24.     }
  25.  };

复杂度分析

  • 时间复杂度:O(N)O(N),其中 NN 是链表中的节点数。

  • 空间复杂度:O(N)O(N),其中 NN 是链表中的节点数。主要为线性表的开销。

方法二

找中间结点 反转右半部分的链表 进行插入

  1. class Solution {
  2.  public:
  3.      void reorderList(ListNode* head)
  4.     {
  5.          if (head == nullptr)  return;
  6.          ListNode*L1=head;
  7.          ListNode *mid=middleNode(head);
  8.          ListNode*L2=mid->next;
  9.              mid->next=nullptr;
  10.          L2=reverseList(L2);
  11.          mergeList( L1, L2);
  12.          
  13.        
  14.     }
  15.  ​
  16.        ListNode* middleNode(ListNode* head) //通过快慢指针求中间结点
  17.     {
  18.          ListNode* slow = head;
  19.          ListNode* fast = head;
  20.          while (fast->next != nullptr && fast->next->next != nullptr)
  21.         {
  22.              slow = slow->next;
  23.              fast = fast->next->next;
  24.         }
  25.          return slow;
  26.     }
  27.  ​
  28.  ​
  29.      ListNode* reverseList(ListNode* head)
  30.     {
  31.          ListNode *cur=head;
  32.          ListNode *prev=nullptr;
  33.          while(cur!=nullptr)
  34.         {
  35.              ListNode*newdata=cur->next;
  36.              cur->next=prev;
  37.              prev=cur;
  38.              cur=newdata;
  39.         }
  40.          return prev;
  41.     }
  42.  ​
  43.     void mergeList(ListNode* L1, ListNode* L2) {
  44.          ListNode* L1_tmp;
  45.          ListNode* L2_tmp;
  46.          while (L1 != nullptr && L2 != nullptr)
  47.           {
  48.              L1_tmp = L1->next;
  49.              L2_tmp = L2->next;
  50.  ​
  51.              L1->next = L2;
  52.              L1 = L1_tmp;
  53.  ​
  54.              L2->next = L1;
  55.              L2 = L2_tmp;
  56.         }
  57.     }
  58.  };

复杂度分析

  • 时间复杂度:O(N)O(N),其中 NN 是链表中的节点数。

  • 空间复杂度:O(1)O(1)。

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

闽ICP备14008679号