知识点:两大类七小类
1. 合并与分解
2. 找点
- 合并2个有序链表
- 1个哨兵节点,1个扫描指针(用于扫描原始链表)
- 2个p指针(双指针)拉拉链
- 一共需要新建4个指针
- 合并k个有序链表
- 1个哨兵节点,1个扫描指针,1个临时node
- 1个优先队列
- 把每个链表的第一个节点的值和节点本身放到优先队列中。每次弹出最小值然后把后面的节点继续放回到优先队列中,直到k个链表结束
- 时间复杂度为O(nlogk)
- from Queue import PriorityQueue
- pq = PriorityQueue()
- pq.put((i.val, i))
- pq.get()
- 分解链表:小的在前头,大的在后头,要保持相对位置
- 2个哨兵节点,1个扫描指针(用于扫描原始链表)
- 双指针,大节点给A,小节点给B,然后AB接一块儿
- 一共需要新建5个指针
- 找出倒数第k个节点
- 1个哨兵节点
- 只需要遍历一次
- 双指针,快指针先移动k步,然后快慢指针一起走
- 快指针到None的时候,慢指针到了倒数第k个节点
- 找出中点
- 快慢指针
- slow每次走一步,fast每次走两步
- 有环?找出入环点
- 快慢指针,slow一步,fast两步
- 判环:fast能和slow相遇,有环;fast走到了None,无环
- 找环:slow重新=head,然后fast和slow一起走,相遇点就是入环点
- 相交?找出交点
- 2个扫描指针
- 遍历完A继续遍历B,遍历完B继续遍历A
- 交点之前的节点个数相同,两个指针相遇的时候,这个节点即交点
23. Merge k Sorted Lists
from Queue import PriorityQueue
class Solution(object):
def mergeKLists(self, lists):
dummy = ListNode(0)
p = dummy # p是扫描指针
pq = PriorityQueue()
for i in lists:
if i:
pq.put((i.val, i))
while not pq.empty():
val, node = pq.get()
p.next = ListNode(val) # 创建一个节点放在p.next的位置
p = p.next
node = node.next # node跳到下一个重新放回到优先队列中
if node:
pq.put((node.val, node))
return dummy.next