Leetcode中单链表题总结
以下是个人对所做过的LeetCode题中有关链表类型题的总结,博主小白啊,若有错误的地方,请留言指出,谢谢。
一、有关反转链表
反转链表是在单链表题中占很大的比例,有时候,会以各种形式出现在题中,是比较重要的知识点。
(1)题Reorder list中,思路为将链表一分为二,将后者反转以后,然后两链表交叉连接起来即可,这里值得注意的有:链表一分为二以后,前半段的链表最后要指向NULL,以形成两单链表的交叉链接的情况;另外一点是,当链表个数为奇数时,以快慢指针形式分割的链表,后半段的个数会多一个,所以,最后的时候,要判断后半段是否结束。
(2)题Reverse linked list ii中要反转链表中的一段,思路为:找到反转的起始点和其前缀,然后根据需反转的个数写一个for循环,来实现反转,这里用到的可以说是增加表头的反转(更多详见反转单链表)。这里值得注意的是,题中中给的范围和结点的对应。
(3)题Reverse nodes in k group要以每K个结点为单位进行反转,思路为:先统计结点数,然后每K个结点进行反转 ,这里使用的技巧是,使用计数器,当num小于k时反转。每次反转结束,要更新前结点等。Swap nodes in pairs是上一题的当K等于2时的特殊情况,不过,因为只是每两个进行交换,所以不需要使用计数器,只要两两交换即可。
二、链表归并排序
(1)Merge two sorted lists合并两链表,可以使用归并排序的思想,每次从表头取出值较小的结点,排到新链表中。这里值得注意的是,当链表中有一个提前结束时,要将另一个的剩下的结点链接到新链表中。Sort list是归并排序的链表实现。Merge k sorted lists是对链表归并排序的延续,这里有三种方法:一是先合并两条,然后用新的去合并下一条,直到所有的都合并结束;二是链表两两合并,用形成的新链表列再两两合并,直到只剩下一条;三是使用优先队列,每次从队列头取出当前值最小的节点,形成新的链表。
三、快慢指针
这里以快慢指针形式的还有Convert sorted list to binary search tree、Sort list、Linked list cycle、Linked list cycle ii、还有几题是快慢指针的另一种变形,总体来说,使用快慢指针的思想很重要。
(1)Linked list cycle、Linked list cycle ii都是快慢结点的应用,关键在理解题意。判断是否有环,看快慢指针是否相遇即可,找到环起点,只要在相遇点,一个放到链表表头,一个从相遇点,两者同步同速的走就行。
(2)Convert sorted list to binary search tree使用快慢指针找到根结点,然后递归实现就行。
四、删除结点
(1)Remove duplicates from sorted list删除重复结点,只保留一个重复结点,思路是,当当前结点cur和其next相等时,更新cur的next,不相等则cur前进。Remove duplicate from sorted list ii是前一题的升级版,只要结点值有重复的都删除,这时,因为可能删除头结点,所以要新建一个表头。思路:用前结点pre(初始为表头的前缀)的next和当前结点cur的next比较,若值相等,则cur前移,(是和cur->next比较而不是cur)这样的做的原因是为了方便pre位置的下一次确定。只有当pre和cur之间没有重复的时pre才移动,类似于1->2->3,pre为1,cur为2;当之间有重复的时候,只是更新pre的后缀而已,然后再移动cur继续比较。
(2)题remove nth node from the end of list中要删除指定的结点,这类题是快慢指针的另一种变形。思路:先快指针先走,然后快慢指针同时同速一块走。
五、其他
(1)题Add two numbers中,两正整数以指针的形式表示,求其和,思路关键在于:对两链表中有一个提前结束的理解,这里可以采取有就加,没有就跳。另外一点是最高位的进位值得注意。
(2)题Partition list中,要将小于给定值的结点放在不小于给定值结点之前,且保持相对顺序不变。思路有几种(这里介绍两种):一是找到第一个不小于给定值的结点及其前缀,然后从这个结点开始向后遍历,将小于给定值的结点都插入到前缀和该结点之间(前缀要更新)
(3)Copy list with random pointer分三步,第一插入新结点,二调整random,三形成新链表。
Leetcode中单链表题总结的更多相关文章
- 【算法题 14 LeetCode 147 链表的插入排序】
算法题 14 LeetCode 147 链表的插入排序: 解题代码: # Definition for singly-linked list. # class ListNode(object): # ...
- 【python】Leetcode每日一题-旋转链表
[python]Leetcode每日一题-旋转链表 [题目描述] 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置. 示例1: 输入:head = [1,2,3,4,5] ...
- 【python】Leetcode每日一题-删除排序链表中的重复元素
[python]Leetcode每日一题-删除排序链表中的重复元素 [题目描述] 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 . 返回同 ...
- 【python】Leetcode每日一题-删除排序链表中的重复元素2
[python]Leetcode每日一题-删除排序链表中的重复元素2 [题目描述] 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表 ...
- 【python】Leetcode每日一题-反转链表 II
[python]Leetcode每日一题-反转链表 II [题目描述] 给你单链表的头节点 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 ...
- Leetcode OJ 刷题
Valid Palindrome吐槽一下Leetcode上各种不定义标准的输入输出(只是面试时起码能够问一下输入输出格式...),此篇文章不是详细的题解,是自己刷LeetCode的一个笔记吧,尽管没有 ...
- Leetcode 第 2 题(Add Two Numbers)
Leetcode 第 2 题(Add Two Numbers) 题目例如以下: Question You are given two linked lists representing two non ...
- LeetCode 86 | 链表基础,一次遍历处理链表中所有符合条件的元素
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第53篇文章,我们一起来看LeetCode第86题,Partition List(链表归并). 本题的官方难度是M ...
- 【LeetCode每日一题 Day 2】2. 两数相加
大家好,我是编程熊,今天是LeetCode每日一题的第二天,一起学习的是LeetCode第二题<两数相加>. 题意 给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 ...
随机推荐
- 「日常训练」Caterpillar(POJ-3310)
题意与分析 一条很有趣的题目.给一个无向图,问它是否无环,且可以在上面找到一条线,使所有的顶点要么在线上要么不在线上但在与线相连的边上. 那么首先要确定所有点联系在一起.这个可以同判环一起处理:如果建 ...
- 「日常训练」School Marks(Codeforces Round 301 Div.2 B)
题意与分析(CodeForces 540B) 题意大概是这样的,有一个考试鬼才能够随心所欲的控制自己的考试分数,但是有两个限制,第一总分不能超过一个数,不然就会被班里学生群嘲:第二分数的中位数(科目数 ...
- sql注入--高权限,load_file读写文件
select '<?php eval($_POST[123]) ?>' into outfile '/var/www/html/1.php'; 1.MYSQL新特性限制文件写入及替代方法 ...
- jieba结巴分词
pip install jieba安装jieba模块 如果网速比较慢,可以使用豆瓣的Python源:pip install -i https://pypi.douban.com/simple/ jie ...
- Java 递归 反射 正则表达式
一 递归 1. 就是函数自身调用自身 (就是在栈内存中不断的加载同一个函数) 2. 什么时候用递归呢? 当一个功能被重复使用 而每一次使用该功能时的参数不确定 都由上次的功能元素结果来确定 简单说: ...
- Spring Boot 示例项目
Spring Boot 基于注解式开发 maven REST 示例项目 项目地址:https://github.com/windwant/spring-boot-service 项目地址: ...
- mpvue笔记
简介: mpvue 修改了 Vue.js 的 runtime 和 compiler 实现,为小程序开发引入 Vue.js 开发体验 我觉得就像scss一样,写的时候方便,最后还是要转成css文件 搭建 ...
- Netcore logging config
- MyBatis中文文档
http://mybatis.github.io/mybatis-3/zh/index.html
- 一个简单的Spring的AOP例子
目标对象的接口:IStudent.java 1 /** 2 * 3 */ 4 package com.dragon.study; 5 6 /** 7 * @author ...