微信改版,加星标不迷路!

每日一算法-重排链表

作者:阿广

阅读目录

? 题目

? 解析

? 完整代码

1 题目

给定一个单链表 LL0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→LnL1→Ln-1→L2→Ln-2→…

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

示例 1:

给定链表 1->2->3->4
重新排列为 1->4->2->3.

示例 2:

给定链表 1->2->3->4->5
重新排列为 1->5->2->4->3.

2 解析

虽然代码比较长,但是思路很简单,听我慢慢讲来。

首先通过快慢指针确定链表的中间位置;

然后将中间位置之后的后半段链表压入栈中;

最后出栈,并按照规则插入到链表的相应位置。

2.1首先通过快慢指针确定链表的中间位置;

//快慢指针找到中点
ListNode* s = head;
ListNode* q = head;
while(q && q->next && q->next->next){
      s = s->next;
      q = q->next->next;
}

2.2然后将中间位置之后的后半段链表压入栈中;

//将右边部门压入栈中
ListNode* right = s->next;
s->next = NULL;
stack<ListNode*> st;
while(right){
     st.push(right);
     right = right->next;
}

2.3最后出栈,并按照规则插入到链表的相应位置。

//将栈中的数按照规则出栈并插入
ListNode* cur = head;
while(!st.empty()){
      ListNode* p = st.top();
      st.pop();
      ListNode* next = cur->next;
      cur->next = p;
      p->next = next;
      cur = next;
}

肯定有读者会提出,能不能详细介绍一下啊,这些指针指来指去的好乱啊,下面用图给你们讲解一下。

有点难看,确是本题的骨髓~

3 完整代码


/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
   void reorderList(ListNode* head) {
      if(!head || !head->next) return ;
       //快慢指针找到中点
       ListNode* s = head;
       ListNode* q = head;
       while(q && q->next && q->next->next){
           s = s->next;
           q = q->next->next;
       }
       
       //将右边压入栈中
       ListNode* right = s->next;
       s->next = NULL;
       stack<ListNode*> st;
       while(right){
           st.push(right);
           right = right->next;
       }
       
       //将栈中的数按照规则出栈并插入
       ListNode* cur = head;
       while(!st.empty()){
           ListNode* p = st.top();
           st.pop();
           ListNode* next = cur->next;
           cur->next = p;
           p->next = next;
           cur = next;
       }
   }
};

今日问题

谈一下你了解的贪心算法是什么?

打卡格式:打卡第n天,答:...

为什么打卡?戳下面你就知道了!

21/天/养/一/个/好/习/惯

【每日一算法】重排链表相关推荐

  1. 【每日一算法】相交链表

    微信改版,加星标不迷路! 每日一算法 - 相交链表 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, l ...

  2. 【每日一算法】 合并两个有序链表

    微信改版,加星标不迷路! 每日一算法-合并两个有序链表 作者:阿广 阅读目录 1 题目 2 解析 1 题目 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. ...

  3. 【每日一算法】二叉树的层次遍历 II

    每日一算法-二叉树的层次遍历 II 题目 给定一个二叉树,返回其节点值自底向上的层次遍历. (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如: 给定二叉树 [3,9,20,null,n ...

  4. 【每日一算法】两数相加

    微信改版,加星标不迷路! 每日一算法-两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两 ...

  5. 【L2-022 重排链表】天梯赛L2系列详细解答

    天梯赛L2-022 重排链表 题目详情: 输入样例: 00100 6 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 6823 ...

  6. 【每日一算法】对称二叉树

    每日一算法-对称二叉树 题目 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1   / \  2   2 / \ / \ 3  4 4  3 但是 ...

  7. 【每日一算法】使用二分法解决x 的平方根问题

    每日一算法-x 的平方根 题目 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: ...

  8. 【每日一算法】最大子序列和

    每日一算法-最大子序列和 题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] ...

  9. 【每日一算法】杨辉三角 II

    每日一算法-杨辉三角 II 题目 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 3 输出: [1,3,3,1] ...

最新文章

  1. 日本依靠储能系统解决光伏消纳问题
  2. MySQL 5.1中IN查询不要用到NULL条件
  3. Pytorch-使用Bert预训练模型微调中文文本分类
  4. Java动态代理之cglib
  5. 【Ubuntu】Ubuntu16.04安装 搜狗输入法 史上最详细
  6. mysql5.5删除干净_MySql5.5 安装及卸载
  7. linux用户批量修改密码,Linux 命令详解 chpasswd 批量修改用户密码
  8. 字符设备与块设备的区别
  9. php检查数组下标是否,php检查数组下标是否存在
  10. Smart3D输出/输入空三结果
  11. OpenCV下载驿站(解决github下载问题,解决OpenCV官网下载较慢)
  12. html调用java函数_html通过JavaScript调用java代码
  13. Halcon练习:图片及文件夹的读取
  14. 把Excel转换成word文档有什么简单的方法
  15. 《增长黑客》学习总结
  16. 近岸蛋白递交注册:年营收3.4亿 朱化星控制71.24%表决权
  17. 《商用密码应用与安全性评估》第四章 密码应用安全性评估实施要点-小结
  18. DDL,DQL,DML,DCL全称
  19. Java多线程与并发相关 — 原理
  20. Web前端之网页导航----搜导航狐邮箱(float)

热门文章

  1. 模型神器组合,yyds!
  2. GEMM性能提升200倍,AutoKernel算子优化工具正式开源
  3. 精选实践 | 爱奇艺实用数据库选型树:不同场景如何快速选择数据库?
  4. 这些算法工程师,他们真的是太难了!
  5. AIの幕后人:探秘“硬核英雄”的超级武器
  6. 最新Python学习项目Top10!
  7. AI 技术实力图谱全解析!2018 中国 AI 开发者大会重磅来袭
  8. What-If 工具:无需写代码,即可测试机器学习模型
  9. 实战 | 这是一个转型AI的励志故事,从非科班到拿下阿里云栖一等奖,他经历的坑足够你学习100天
  10. 颠覆认知:SRE 到底是干啥的?