第一题 92. Reverse Linked List II
题目描述
将链表的[m,n]段就地逆置,一趟遍历完成。
算法
在就全部反转的基础上,这次先记下一个pre的位置,每一次新的节点都是接在这个pre的后面。然后按照之前的思路进行就地反转
|
|
第二题 138. Copy List with Random Pointer
题目描述
给定一个链表,其中的节点包含一个额外的随机指针,可能指向链表中的任意一个节点或者为空。
返回链表的深拷贝。
算法
主要有两种思路,一种是利用HashMap存储下对应的点,然后取出每个点进行复制。
第二种思路是将每一个点复制在当前节点的后面,然后利用这样的办法复制整个LinkedList
HashMap
|
|
Iterative
|
|
第三题 143. Reorder List
题目描述
给定一个单链表L:L0→L1→…→Ln-1→Ln
重新将其排序为: L0→Ln→L1→Ln-1→L2→Ln-2→…
必须在不改变节点值的前提下就地完成链表的顺序重排
算法
- 利用快慢指针找到链表中点mid,将链表分为左右两半
- 将链表的右半部分就地逆置
- 合并链表的左右两部分
|
|
第四题 147. Insertion Sort List
题目描述
使用插入排序对链表排序。
算法
|
|
第五题 148. Sort List
题目描述
使用常数空间复杂度,对一个链表执行O(n log n)时间复杂度的排序
算法
归并排序,链表的中点可以通过“快慢指针”法求得。
|
|
第六题 160. Intersection of Two Linked Lists
题目描述
编程求两个单链表的交点
- 如果链表没有交点,返回null
- 链表在函数返回时必须保留原始结构
- 可以假设链表中没有环
- 代码最好时间复杂度为O(n),空间复杂度O(1)
算法
维护两个指针pA和pB,初始分别指向A和B。然后让它们分别遍历整个链表,每步一个节点。
当pA到达链表末尾时,让它指向B的头节点(没错,是B);类似的当pB到达链表末尾时,重新指向A的头节点。
如果pA在某一点与pB相遇,则pA/pB就是交点。
|
|
第七题 203. Remove Linked List Elements
题目描述
从单链表中移除所有值为val的元素。
算法
Iterative
|
|
Recursive
|
|
第八题 234. Palindrome Linked List
题目描述
给定一个单链表,判断它是否是回文。
进一步思考:
你可以在O(n)时间复杂度和O(1)空间复杂度完成吗?
算法
1). 使用快慢指针寻找链表中点
2). 将链表的后半部分就地逆置,然后比对前后两半的元素是否一致
3). 恢复原始链表的结构(可选)
|
|
第九题 328. Odd Even Linked List
题目描述
给定一个单链表,将其节点进行分组,使得所有的奇数节点排列在前,偶数节点在后。请注意这里的奇偶指的是节点序号而不是节点的值。
你应当尝试“就地”完成此问题。程序应当满足O(1)的空间复杂度和O(nodes)的时间复杂度。
测试用例见题目描述。
算法
其实可以不用dummy的头结点
|
|