您的位置:首页 > 汽车 > 新车 > 专业设计网站排行榜_深圳坪山人民医院_制作网站的基本步骤_福州关键词搜索排名

专业设计网站排行榜_深圳坪山人民医院_制作网站的基本步骤_福州关键词搜索排名

2024/11/16 16:11:18 来源:https://blog.csdn.net/vavid317/article/details/143804276  浏览:    关键词:专业设计网站排行榜_深圳坪山人民医院_制作网站的基本步骤_福州关键词搜索排名
专业设计网站排行榜_深圳坪山人民医院_制作网站的基本步骤_福州关键词搜索排名

一、示例
在这里插入图片描述

在这里插入图片描述

二、上代码

class Solution {
public:void reorderList(ListNode* head) {if (head == nullptr || head->next == nullptr) return;ListNode* mid = FindMiddleNode(head);   // 找到中间节点ListNode* l1 = head;ListNode* l2 = mid->next;mid->next = nullptr;l2 = ReverseList(l2);   // 反转后半段的链表节点mergeList(l1, l2);      // 合并两端长度相差不超过1的链表}// 快慢指针找到中间节点ListNode* FindMiddleNode(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* pre = nullptr;ListNode* cur = head;ListNode* next;while (cur != nullptr) {next = cur->next;cur->next = pre; // 反转pre = cur;       // 向后移动cur = next;}return pre;}// 合并链表void mergeList(ListNode* l1, ListNode* l2) {ListNode* temp1;ListNode* temp2;while (l1 != nullptr && l2 != nullptr) {temp1 = l1->next;temp2 = l2->next;l1->next = l2;l1 = temp1;l2->next = l1;l2 = temp2;}}
};

三、详解

算法思想:将链表分成两半来处理,前半部分,和后半部分;针对后半部分进行逆序,再从前半部分和逆序后的后半部分分别取一个结点组成一个新的链表。然后就将上面问题分解成更细粒度的子问题:

1、寻找中间节点 FindMiddleNode,采用了快慢指针的算法。

2、链表逆序参考前面文章:链表逆序
本文采用的正向遍历,前面文章采用的递归,都要掌握。

3、合并前半段链表和后半段链表。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com