一、链表
链表的题目一般不难,主要考查coding能力。
1.链表相加
给定2个链表,分别表示2个非负整数。它们的数字逆序存储在链表中,且每个结点只存储一个数字。计算这两个数的和,并返回和的链表头指针。
【分析】leetcode第2题。
逆序存储的好处是,可以从头指针开始,逐位计算当前位和进位,依次放入表示和的链表中。
【扩展思路】上述逆序链表这个结构其实非常巧妙,还可以用来实现大数运算。(我以前都是用数组做=,=,数组的好处是可以随机访问,做乘法方便定位,,但链表做乘法嘛……呃,需要多用辅助指针……)
【我的代码:4ms】
2. 链表翻转
给定一个链表,翻转该链表第m到第n个位置。要求直接翻转而非申请新空间。如,给定1,2,3,4,5,m=2, n=4, 返回1,4,3,2,5。
【分析】leetcode 第92题。
一般使用头插法,把后面的结点依次插入头结点前面,注意是依次。这样,只需要一个指针记录参考结点,一个指针遍历待翻转结点,一个计数器。
【我的代码】0ms
3.链表去重
给定排序的链表,删除重复元素,只保留第一次出现的结点。
【分析】leetcode第83题。
很简单,因为链表已经有序了,直接删除后面相同的元素即可。
【我的代码】1ms。
4. 链表划分
给定一个链表和一个值x,将链表划分为两部分,使得小于x的结点在前,大于等于x的结点在后。在这两部分中要保持原链表中的出现顺序。
【分析】leetcode第86题。
有点类似于快排中的partition过程。但注意到链表的特殊结构,可以直接申请2个指针,把小于x的结点都插入第一个指针后面,大于等于x的结点都插入第2个指针后面,最后再把这2个链表接起来就可以了。时间复杂度为n,空间为2.
【思路扩展】快速排序也可以用单链表结构存储。但注意不是所有排序都适合单链表结构,比如堆排序就不适合。
【我的代码】1ms。
5.单链公共结点问题
给定2个单向链表,计算两个链表的第一个公共结点。若没有公共结点,返回空。
【分析】leetcode第160题。
注意是单向链表,所以在公共结点之后的所有结点是相同的,不可能出现x形结构。因此,可以先遍历2个链表,得到长度m,n。然后长链表先走|m-n|步,然后同步走,直到指向同一个结点。
【思路扩展】如果是链表中存在环,则需要用快慢指针的方式计算公共结点。即2个指针,每次分别移动1步或2步。
【我的代码】2ms。