链表双指针

目录

1.合并k个有序链表

2.判断链表中是否有环

3.如果有环返回第一个入环结点

4.相交链表

5.链表的中间结点

6.K个一组翻转链表

 7.删除排序链表中重复的元素

8.反转链表

9.回文链表


1.合并k个有序链表


leetcode23题
合并两个有序链表的解题思路就是前面归并排序中的merge方法。

解题思路:合并k个有序序列的链表的逻辑类似合并两个有序链表,难点在于,如何快速得到k个结点中的最小结点,这里我们可以想到使用PriorityQueue或者TreeSet数据结构来存储k个结点,每次弹出一个结点(最小值对应的结点),然后弹出的结点的下一个结点添加到数据结构中,直至对列为null。

```Java
public static ListNode mergeKLists(ListNode[] lists) {
        //小根堆
        PriorityQueue<ListNode> pq=new PriorityQueue<>(new Comparator<ListNode>() {
            @Override
            public int compare(ListNode o1, ListNode o2) {
                return o1.val-o2.val;
            }
        });
        ListNode dummy=new ListNode(-1);
        ListNode p=dummy;
        //将链表中的头结点加入队列中
        for (ListNode listnode:lists){
            if(listnode!=null){
            pq.add(listnode);
        }
        //弹出,加入
        while(!pq.isEmpty()){
            ListNode node=pq.poll();
            p.next=node;
            p=p.next;
            if(node.next!=null){
                pq.add(node.next);
            }
        }
        return dummy.next;
    }
```

优先队列的弹出和添加操作时间复杂度O(logk),总的时间复杂度O(NlogK),N是总结点数。

2.判断链表中是否有环

leetcode141题

要求:给定⼀个链表,判断链表中是否有环,如果链表中存在环,则返回 true,否则返回 false

解题思路:使用快慢指针,fast指针前进两步,slow指针前进一步,如果 fast 最终遇到空指针,说明链表中没有环;如果 fast 最终和 slow 相遇,那肯定是 fast 超过了slow ⼀圈,说明链表中含有环。

```Java
public static boolean hasCycle(ListNode head) {
        ListNode fast=head,slow=head;
        //因为fast指针需要跳两步,所以以下两个条件都得满足
        while(fast!=null&&fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
            if(fast==slow){
                return true;
            }
        }
        return false;
    }
```

3.如果有环返回第一个入环结点

leetcode142题

要求:给定⼀个链表,返回链表开始⼊环的第⼀个节点,如果链表⽆环,则返回 null(不允许修改给定的链表)。

解题思路࿱

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值