链表处理相关问题

86 阅读1分钟

25.k个一组翻转链表

首先封装一个反转链表的函数,传入的参数应该有头节点和尾节点(尾节点用于判断遍历结束,传统的判断为cur != nullptr ,封装的判断应该为cur != tail。返回值为反转后的头节点。

内部的模拟是从头往后遍历,每次截取k个数,前置判断count,是否足够k个,足够的话直接丢进去反转;不足够的话直接break掉然后链接返回。

为了防止断链和连续性判断,应该定义curhead来保持头节点,curtail来确定尾节点,nexthead防止断链,pre用于链接反转后的链表。

一道hard题,主要是封装的反转链表函数会多传一个tail结点,模拟的时候需要设置一些pre、nex结点防止断链。

23.合并k个升序链表

最优解用小根堆,优先队列。 首先遍历链表,将所有节点放入队列中。 然后不断的将队列top弹出,同时判断top是否有后续节点,有的话就将其再放入队列中。循环此过程直到队列为空。

需要注意的是优先队列的重载运算符写法。

struct cmp {
   bool operator()(node* a, node* b) {
      return a->val > b->val;
   }
}
priority_queue<node*,  vector<node*>, cmp> q;

完成了传入两个节点 a、b的自定义大小比较。