赞
踩
方法一 放入容器vector 然后访问下标去进行编写
- class Solution {
- public:
- void reorderList(ListNode* head) {
- if (head == nullptr) {
- return;
- }
- vector<ListNode*> vec;
- ListNode* node = head;
- while (node != nullptr) {
- vec.emplace_back(node);
- node = node->next;
- }
- int i = 0, j = vec.size() - 1;
- while (i < j) {
- vec[i]->next = vec[j];
- i++;
- if (i == j) {
- break;
- }
- vec[j]->next = vec[i];
- j--;
- }
- vec[i]->next = nullptr;
- }
- };
复杂度分析
时间复杂度:O(N)O(N),其中 NN 是链表中的节点数。
空间复杂度:O(N)O(N),其中 NN 是链表中的节点数。主要为线性表的开销。
方法二
找中间结点 反转右半部分的链表 进行插入
- class Solution {
- public:
- void reorderList(ListNode* head)
- {
- if (head == nullptr) return;
- ListNode*L1=head;
- ListNode *mid=middleNode(head);
- ListNode*L2=mid->next;
- mid->next=nullptr;
- L2=reverseList(L2);
- mergeList( L1, L2);
-
-
- }
-
- ListNode* middleNode(ListNode* head) //通过快慢指针求中间结点
- {
- ListNode* slow = head;
- ListNode* fast = head;
- while (fast->next != nullptr && fast->next->next != nullptr)
- {
- slow = slow->next;
- fast = fast->next->next;
- }
- return slow;
- }
-
-
- ListNode* reverseList(ListNode* head)
- {
- ListNode *cur=head;
- ListNode *prev=nullptr;
- while(cur!=nullptr)
- {
- ListNode*newdata=cur->next;
- cur->next=prev;
- prev=cur;
- cur=newdata;
- }
- return prev;
- }
-
- void mergeList(ListNode* L1, ListNode* L2) {
- ListNode* L1_tmp;
- ListNode* L2_tmp;
- while (L1 != nullptr && L2 != nullptr)
- {
- L1_tmp = L1->next;
- L2_tmp = L2->next;
-
- L1->next = L2;
- L1 = L1_tmp;
-
- L2->next = L1;
- L2 = L2_tmp;
- }
- }
- };
复杂度分析
时间复杂度:O(N)O(N),其中 NN 是链表中的节点数。
空间复杂度:O(1)O(1)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。