赞
踩
一、合并有序链表
1.需要一个虚拟节点做合并新列表的头节点
2.如果合并的链表条数不止两条的话,可以 建立一个 优先级队列(可以使用数组配合sort建立),放各个链表的头节点。
二、单链表的倒数第K个节点
可以使用双指针,让一个指针先走k步,然后再让另一个指针开始走,同时第一个指针也继续走,当第一个指针走到结尾,第二个指针指向的就是倒数第k个节点。
三、 单链表的中点
可以采用快慢指针,核心思路就是一个指针走一步,另一个指针走两步,当其中一个指针走到链表尾部时,另一个指针指向的就是链表中点
四、判断链表是否包含环并且求环的起点
解决办法也是快慢指针,每当慢指针slow
前进一步,快指针fast
就前进两步,如果fast
最终遇到空指针,说明链表中没有环;如果fast
最终和slow
相遇,那肯定是fast
超过了slow
一圈,说明链表中含有环。
fast
一定比slow
多走了k
步,这多走的k
步其实就是fast
指针在环里转圈圈,所以k
的值就是环长度的「整数倍」。
假设相遇点距环的起点的距离为m
,那么结合上图的 slow 指针,环的起点距头结点head
的距离为k - m
,也就是说如果从head
前进k - m
步就能到达环起点。
巧的是,如果从相遇点继续前进k - m
步,也恰好到达环起点。因为结合上图的 fast 指针,从相遇点开始走k
步可以转回到相遇点,那走k - m
步肯定就走到环起点了
所以,只要我们把快慢指针中的任一个重新指向head
,然后两个指针同速前进,k - m
步后一定会相遇,相遇之处就是环的起点了。
五、两个链表是否相交
我们可以让p1
遍历完链表A
之后开始遍历链表B
,让p2
遍历完链表B
之后开始遍历链表A
,这样相当于「逻辑上」两条链表接在了一起。
C1即为相交节点。
六、反转链表的一部分
这个题目主要训练了如何拆解复杂问题,
1.反转链表的一部分 ——> 2.反转链表前N个节点 —> 3.反转整个链表
七、判断是不是回文链表
解决办法一
.后序遍历
解决办法二
直接反转链表进行比对
解决办法三.
双指针技巧找到链表中点,反转后面部分链表进行比对
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。