首页 > 其他分享 >链表双指针技巧

链表双指针技巧

时间:2023-02-27 16:23:21浏览次数:51  
标签:node slow ListNode 技巧 fast next 链表 指针

题目 难度 要点
分隔链表 快慢指针:不用两个新链表拼接,使用原地修改
合并K个升序链表 最小堆:类ProirityQueue的使用
环形链表 快慢指针:相遇有环

分隔链表

image
题目要求按原顺序,以x值将小的放链表前半段,其他的放链表后半段。很容易想到一种解法,新开两条链表分别存放,最后将两条链表合并。题目难度给个中等,可以考虑换个复杂点的原地修改解法。那么需要了解2个地方的信息:1.待插入的节点 2.需要移动的节点。很容易就可以想到快慢指针,慢指针等待插入,快指针寻找小于x的节点,进行操作即可。

public ListNode partition(ListNode head, int x) {
        ListNode dummy = new ListNode(-1, head);
        ListNode slow = dummy;
        while (slow.next != null && slow.next.val < x) {
            slow = slow.next;
        }
        ListNode fast = slow;
        while (fast != null && fast.next != null) {
            if (fast.next.val < x) {
                ListNode temp = fast.next;
                fast.next = temp.next;
                temp.next = slow.next;
                slow.next = temp;
                slow = slow.next;
            } else {
                fast = fast.next;
            }
        }
        return dummy.next;
    }

合并K个升序链表

image
两个链表合并的升级版。JAVA没有大小堆的直接类,但是优先级队列类底层默认为最小堆,可指定Comparator变为最大堆。
思路:首先放链表个数的节点到最小堆中,每次取出最小的置于新链表。如果节点有子节点则加入优先级队列自动排序。重复步骤直到队列为空即可。

    public ListNode mergeKLists(ListNode[] lists) {
        if (lists == null || lists.length == 0) {
            return null;
        }
        ListNode dummy = new ListNode(), p = dummy;
        PriorityQueue<ListNode> pq = new PriorityQueue<>(lists.length, (a, b) -> (a.val - b.val));
        for (ListNode node: lists) {
            if (node != null) {
                pq.add(node);
            }
        }
        while (!pq.isEmpty()) {
            ListNode node = pq.poll();
            if (node.next != null) {
                pq.add(node.next);
            }
            p.next = node;
            p = p.next;
        }
        return dummy.next;
    }

标签:node,slow,ListNode,技巧,fast,next,链表,指针
From: https://www.cnblogs.com/kiper/p/17159122.html

相关文章

  • Go组件库总结之介入式链表
    本篇文章我们用Go封装一个介入式的双向链表,目的是将链表的实现和具体元素解耦。文章参考自:https://github.com/brewlin/net-protocol1.元素的接口typeElementinterface......
  • 彻底搞懂React-hook链表构建原理
    写在前面的小结每一个hook函数都有对应的hook对象保存状态信息useContext是唯一一个不需要添加到hook链表的hook函数只有useEffect、useLayoutEffect以及us......
  • Java开发中要避免的坑和一些代码优化技巧
    1:动态SQL遇到的坑,先看下面OGNL表达式的说明。Anyobjectcanbeusedwhereabooleanisrequired.OGNLinterpretsobjectsasbooleanslikethis:Iftheobjecti......
  • 力扣简876 链表的中间节点
    只要一个一步一步走另一个指针两步两步走然后快的走到终点慢的就是中点//只有两种情况一种中间节点有一个一种有两个分开讨论一下publicstaticListNodemiddleNo......
  • C++智能指针简单实现
    #include<stdio.h>#include<stdlib.h>classTemp{public:Temp(){printf("%s:构造函数\n",__FUNCTION__);}~Temp(){printf......
  • 读Java性能权威指南(第2版)笔记03_ Java SE API技巧中
    1. 缓冲I/O1.1. 对于文件和套接字,压缩和字符串编码的操作,必须适当地对I/O进行缓冲1.1.1. 两个流操作的是字节块(来自缓冲流)而不是一系列的单字节(来自ObjectOutputStre......
  • [数据结构] 单链表
    一、C语言实现1.1结构体定义typedefintElementType;//定义一个链表结构体structListNode{ElementTypeval;structListNode*next;};1.2相关方法......
  • 移动零(快排思想,快慢指针法)
    题目:给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。示例1:输入:nums......
  • DV仿真环境下问题定位和性能分析工具:基于PC指针,结合map文件分析函数调用轨迹以及耗时
    关键词:DV仿真,Python,map,PC等。 当DV使用复杂软件对硬件进行仿真时,由于没有类似Trace32等IDE调试环境,出现问题往往较难定位问题。同时如果想优化性能,较难直到不同流程耗时......
  • 智能指针
    1template<typenameT>2classCSmartPtr3{4public:5CSmartPtr(T*p=nullptr)6{7if(p!=nullptr)8{9......