互联网算法面试题之旋转链表

2021 年 11 月 25 日 极市平台
↑ 点击 蓝字  关注极市平台

作者丨Dine
来源丨程序员小熊
编辑丨极市平台

极市导读

 

本文介绍一道来自互联网大厂(字节、腾讯、微软等) 面试题 Leetcode 61. 旋转链表,提供虚拟头节点 + 双指针的解题思路,采用动图的方式进行层层剖析,供大家参考,希望对大家无论是刷题还是面试都有所帮助。 >>加入极市CV技术交流群,走在计算机视觉的最前沿

旋转链表

描述

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

解题思路

思考

考虑以下几种情况:

特殊情况

  1. 链表为空或只有一个节点
  2. k 的值为 0 或者为链表长度 L 的整数倍(N > 0)

一般情况

  1. 链表至少有两个节点且 k 既不等于 0 也不等于 L 的整数倍。

思路

  • 特殊情况
  1. 链表为空或只有一个节点, 返回头节点即可
  2. 判断 k == 0,如果等于 0,则直接返回头节点,否则求链表长度 L,再判断 k == NL,如果等于,也可直接返回头节点。
  • 一般情况
  1. 采用 虚拟头节点 + 双指针 的方法,具体如下栗子分析。

举栗

以链表 1->2->3->4->5,k = 2 为栗,如下图示。

  1. 增加虚拟头节点,并让两个快慢指针指向它;
  1. 先让 快指针 fast 向前移动 k 步慢指针 slow 保持不动
  1. 快慢指针 fast/slow 同时向前移动,直至 快指针指向尾节点
  1. 快指针 fast 指向的节点指向链表的头节点,使链表成环;
  1. 将慢指针 slow 指向的节点的 下一节点设置为新链表的头节点
  1. 将慢指针 slow 指向的节点设置为 新链表的尾节点 slow->next = null
  1. 旋转原链表后得到新链表。

完整动图

反思

  1. 如何找到旋转之后得到的新链表的头节点?

采用 双指针 中的 快慢指针

  1. 设置虚拟头节点的作用?

本题设置 虚拟头节点 的作用是找到 新链表的头节点和尾节点。通过 快慢指针 去寻找。

Show me the Code

C++

ListNode* rotateRight(ListNode* head, int k) {  
    /*  特殊情况判断  */  
    if (head == nullptr || head->next == nullptr || k == 0) {  
        return head;  
    }  

    /*  增加虚拟头节点  */  
    ListNode* dummy = new ListNode(0);  
    dummy->next = head;  
      
    /*  获取链表长度  */  
    int len = 0;  
    for (ListNode* node = head; node != nullptr; node = node->next) {  
        len++;  
    }  
      
    k %= len;  
    /*  判断 k 是否是 len 的整数倍  */  
    if (k == 0) {  
        return head;  
    }  
      
    /*  获取新链表的头尾节点  */  
    ListNode *fast = dummy, *slow = dummy;  
    for (int i = 0; i < k; ++i) {  
        fast = fast->next;  
    }   
    while (fast->next != nullptr) {  
        fast = fast->next;  
        slow = slow->next;     
    }          
    fast->next = head;   
    head = slow->next;   
    slow->next = nullptr;  
      
    /*  释放虚拟头节点  */  
    delete dummy;  
      
    return head;  

}  

java

ListNode rotateRight(ListNode head, int k) {  
    if (k == 0 || head == null || head.next == null) {  
        return head;  
    }  

    ListNode dummy = new ListNode(0);  
    dummy.next = head;  
      
    int len = 0;  
    for (ListNode node = head; node != null; node = node.next) {  
        len++;  
    }       
      
    k %= len;  
    if (k == 0) {  
        return head;  
    }  
      
    ListNode fast = dummy, slow = dummy;  
    for (int i = 0; i < k; ++i) {  
        fast = fast.next;  
    }   
    while (fast.next != null) {  
        fast = fast.next;  
        slow = slow.next;     
    }          
    fast.next = head;   
    head = slow.next;   
    slow.next = null;  
      
    return head;  

}  

如果觉得有用,就请分享到朋友圈吧!

△点击卡片关注极市平台,获取 最新CV干货

公众号后台回复“transformer”获取最新Transformer综述论文下载~


极市干货
课程/比赛: 珠港澳人工智能算法大赛 保姆级零基础人工智能教程
算法trick 目标检测比赛中的tricks集锦 从39个kaggle竞赛中总结出来的图像分割的Tips和Tricks
技术综述: 一文弄懂各种loss function 工业图像异常检测最新研究总结(2019-2020)


CV技术社群邀请函 #

△长按添加极市小助手
添加极市小助手微信(ID : cvmart4)

备注:姓名-学校/公司-研究方向-城市(如:小极-北大-目标检测-深圳)


即可申请加入极市目标检测/图像分割/工业检测/人脸/医学影像/3D/SLAM/自动驾驶/超分辨率/姿态估计/ReID/GAN/图像增强/OCR/视频理解等技术交流群


每月大咖直播分享、真实项目需求对接、求职内推、算法竞赛、干货资讯汇总、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企视觉开发者互动交流~



觉得有用麻烦给个在看啦~   
登录查看更多
0

相关内容

Leetcode 高频题 2021 版
专知会员服务
56+阅读 · 2022年2月5日
算法通关手册(LeetCode)
专知会员服务
156+阅读 · 2022年1月13日
TKDE2021 | 基于对抗解耦器的异质网络嵌入
专知会员服务
7+阅读 · 2021年8月27日
专知会员服务
47+阅读 · 2021年5月21日
专知会员服务
37+阅读 · 2021年5月7日
【经典书】数据结构与算法,770页pdf
专知会员服务
135+阅读 · 2021年4月15日
专知会员服务
27+阅读 · 2021年2月17日
最新《自动微分手册》77页pdf
专知会员服务
97+阅读 · 2020年6月6日
实例:手写 CUDA 算子,让 Pytorch 提速 20 倍
极市平台
4+阅读 · 2022年3月8日
Leetcode 高频题 2021 版
专知
1+阅读 · 2022年2月5日
PyTorch 对类别张量进行 one-hot 编码
极市平台
0+阅读 · 2021年12月18日
互联网高频算法面试题-构建乘积数组
极市平台
0+阅读 · 2021年11月24日
谈中小企业算法岗面试
极市平台
1+阅读 · 2021年10月29日
常见的距离算法和相似度计算方法
极市平台
18+阅读 · 2020年7月31日
面经 | 算法工程师面试题汇总
极市平台
12+阅读 · 2019年10月14日
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
1+阅读 · 2014年12月31日
国家自然科学基金
2+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2008年12月31日
Arxiv
0+阅读 · 2022年4月15日
Arxiv
0+阅读 · 2022年4月14日
Identity-aware Graph Neural Networks
Arxiv
14+阅读 · 2021年1月25日
VIP会员
相关VIP内容
Leetcode 高频题 2021 版
专知会员服务
56+阅读 · 2022年2月5日
算法通关手册(LeetCode)
专知会员服务
156+阅读 · 2022年1月13日
TKDE2021 | 基于对抗解耦器的异质网络嵌入
专知会员服务
7+阅读 · 2021年8月27日
专知会员服务
47+阅读 · 2021年5月21日
专知会员服务
37+阅读 · 2021年5月7日
【经典书】数据结构与算法,770页pdf
专知会员服务
135+阅读 · 2021年4月15日
专知会员服务
27+阅读 · 2021年2月17日
最新《自动微分手册》77页pdf
专知会员服务
97+阅读 · 2020年6月6日
相关资讯
实例:手写 CUDA 算子,让 Pytorch 提速 20 倍
极市平台
4+阅读 · 2022年3月8日
Leetcode 高频题 2021 版
专知
1+阅读 · 2022年2月5日
PyTorch 对类别张量进行 one-hot 编码
极市平台
0+阅读 · 2021年12月18日
互联网高频算法面试题-构建乘积数组
极市平台
0+阅读 · 2021年11月24日
谈中小企业算法岗面试
极市平台
1+阅读 · 2021年10月29日
常见的距离算法和相似度计算方法
极市平台
18+阅读 · 2020年7月31日
面经 | 算法工程师面试题汇总
极市平台
12+阅读 · 2019年10月14日
相关基金
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
1+阅读 · 2014年12月31日
国家自然科学基金
2+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2008年12月31日
Top
微信扫码咨询专知VIP会员