LeetCode喜新厌旧专项-链表

本专题记录所有链表相关必刷题
链表的题目一般建立虚拟头节点度dumy后会容易处理

21 合并两个有序链表

    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode dumy=new ListNode(-1);
        ListNode p=dumy;
        ListNode p1=list1,p2=list2;
        while(p1!=null && p2!=null){
            if(p1.val<=p2.val){
                p.next=p1;
                p1=p1.next;
            }else{
                p.next=p2;
                p2=p2.next;
            }
            p=p.next;
        }
        if(p1==null) p.next=p2;
        if(p2==null) p.next=p1;
        return dumy.next;
    }

86 分隔链表

    public ListNode partition(ListNode head, int x) {
        ListNode dumy1=new ListNode();
        ListNode dumy2=new ListNode();
        ListNode p1=dumy1,p2=dumy2,p=head;
        while(p!=null){
            if(p.val<x){
                p1.next=p;
                p1=p1.next;
            }else{
                p2.next=p;
                p2=p2.next;
            }
            ListNode temp=p.next;
            p.next=null;
            p=temp;
        }
        p1.next=dumy2.next;
        return dumy1.next;
    }

合并K个升序链表

    public ListNode mergeKLists(ListNode[] lists) {
        if(lists.length==0) return null;
        ListNode dumy=new ListNode(-1);
        ListNode p=dumy;
        //优先级队列,主要考察优先队列的使用手法(小根堆)
        PriorityQueue<ListNode> pq=new PriorityQueue<ListNode>(
                lists.length,(a,b)->(a.val-b.val));
        for(ListNode head:lists){
            if(head!=null){
                pq.add(head);
            }
        }
        while(pq.size()!=0){
            ListNode node=pq.poll();
            p.next=node;
            if(node.next!=null){
                pq.add(node.next);
            }
            p=p.next;
        }
        return dumy.next;
    }

19 删除链表的倒数第 N 个结点

    public ListNode removeNthFromEnd(ListNode head, int n) {
        //用dumy不用head,可以防止删除第一个节点时空指针异常
        ListNode dumy=new ListNode(-1);
        dumy.next=head;
        //先找到到倒数第k+1个
        ListNode p1=dumy;
        for(int i=0;i<n+1;i++){
            p1=p1.next;
        }
        ListNode p2=dumy;
        while(p1!=null){
            p1=p1.next;
            p2=p2.next;
        }
        p2.next=p2.next.next;
        return dumy.next;
    }

链表的中间节点

    public ListNode middleNode(ListNode head) {
        ListNode slow=head;
        ListNode fast=head;
        while(fast!=null && fast.next!=null){
            slow=slow.next;
            fast=fast.next.next;
        }
        return slow;
    }

判断是否有环

    public boolean hasCycle(ListNode head) {
        ListNode slow=head,fast=head;
        while(fast!=null && fast.next!=null){
            slow=slow.next;
            fast=fast.next.next;
            if(fast==slow){
                return true;
            }
        }
        return false;
    }

142 环形链表返回起点

    public ListNode detectCycle(ListNode head) {
        ListNode slow=head,fast=head;
        while(fast!=null && fast.next!=null){
            slow=slow.next;
            fast=fast.next.next;
            if(fast==slow){
                break;
            }
        }
        if(fast==null || fast.next==null){
            return null;
        }
        slow=head;
        while(slow!=fast){
            slow=slow.next;
            fast=fast.next;
        }
        return slow;
    }

160 相交链表

    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode p1=headA,p2=headB;
        while(p1!=p2){
            if(p1==null) p1=headB;
            else p1=p1.next;
            if(p2==null) p2=headA;
            else p2=p2.next;
        }
        return p1;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值