当前位置: 首页 > news >正文

leetcode 143 重排链表

目录

一、题目描述

二、解题思路

整体思路

具体思路

边界处理:

一、将链表对半分成两份

二、翻转后半部分链表

三、合并两个链表

三、代码实现

一、题目描述

二、解题思路

整体思路

题目要求把重排链表,本质上是一个模拟的问题,我们可以通过以下三步来解决这个问题:

(1)首先,将链表对半分成两份(双指针法);

(2)接着,将后面的链表进行逆转(原地逆转或者头插法);

(3)最后,将前半部分节点构成的链表和第二部分翻转后的链表进行合并(双指针);

具体思路

边界处理:

如果链表为空,或者链表只有一个节点、有两个结点,无需重排,直接return;

一、将链表对半分成两份

(1)定义快慢双指针slow,fast并初始化,当fast不为空且fast->next不为空时,slow走一步,fast走两步,以示例1(结点数为偶数)和示例2(结点数为奇数)为例,循环结束后指针的指向如下:

(2)定义指针first和second分别指向两个新链表的头节点,将两个链表断开,即slow->next=nullptr;

二、翻转后半部分链表

(1)初始化三个指针

<1>指针pre用指向翻转后的头节点,初始化为nullptr(因为开始时未进行翻转);

<2>指针current用于指向真正完成翻转操作的结点,初始化为second;

<3>指针next用于保存正在处理的结点的下一个位置,避免指针丢失;

(2)当current不为nullptr时进行循环

<1>首先,将next的值修改为current的next;

<2>接着,将current的next值修改为pre;

<3>然后,将pre的值修改为current;

<4>最后,将current后移,翻转下一个结点;

(3)翻转完成后,更新second的值为pre

三、合并两个链表

当first和second的值均不为nullptr时,进行循环:

<1>指针firstnext用于记录first的下一个位置的地址,指针secondnext用于记录second的下一个位置的地址;

<2>将second指向的结点接入first指向的结点的后面;

<3>更新first和second的值;

三、代码实现

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:void reorderList(ListNode* head) {//边界处理if(!head&&!head->next&&!head->next->next) return ;//1.拆分两个链表(快慢双指针)ListNode* slow=head;ListNode* fast=head->next;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;}ListNode* first=head;ListNode* second=slow->next;//断开两个链表slow->next=nullptr;//2.翻转second链表(原地翻转)ListNode* pre=nullptr;        //保存翻转后的头节点ListNode* current=second;     //保存正在处理的节点ListNode* next;               //保存下一个节点while(current){next=current->next;current->next=pre;pre=current;current=next;}second=pre;//3.合并两个链表while(first&&second){ListNode* firstnext=first->next;ListNode* secondnext=second->next;second->next=first->next;first->next=second;first=firstnext;second=secondnext;}}
};

http://www.dtcms.com/a/503819.html

相关文章:

  • 元宇宙与职业教育的深度融合:重构技能培养的实践与未来
  • 坪山网站建设哪家便宜帝国cms 网站地图 自定义
  • 双拼输入法:提升打字效率的另一种选择
  • 如何做论坛网站 知乎整套网页模板
  • XSS平台xssplatform搭建
  • SQL入门(structured query language)
  • SAP SD客户主数据查询接口分享
  • RedPlayer 视频播放器在 HarmonyOS 应用中的实践
  • 网站怎么做彩页wordpress 微信打赏
  • Altium Designer创建一个空白工程
  • SciPy 稀疏矩阵
  • 上海网站制作维护南京网站建设索q.479185700
  • 运用API开放接口获取淘宝商品价格信息,对比全网价格
  • 笔记【数据类型,常量,变量】
  • 翠峦网站建设做众筹网站
  • FFmpeg 基本API avformat_find_stream_info函数内部调用流程分析
  • 面试(1)——Java 数据类型和语法基础
  • 网站流量的主要来源有产品设计方案3000字
  • 厦门 网站建设闽icp网站重定向过多
  • 安康市建设规划局网站网站内容建设出现的问题
  • 块元素、行内元素、HTML5新增标签(本文为个人学习笔记,内容整理自哔哩哔哩UP主【非学者勿扰】的公开课程。 > 所有知识点归属原作者,仅作非商业用途分享)
  • 东莞易赢seo推广员招聘
  • linux常用命令(8)——用户管理
  • 义乌网站制作公司建设广告网站
  • 智能宠物用品店分类架构设计 (台湾市场)
  • 第二十一周 学习周报
  • Linux操作系统学习之---线程控制
  • 2018网站开发的革新外贸企业网站系统
  • 我要学习网站建设鹤壁市城乡一体化示范区规划图
  • PS基本教学(四)——选区