Leetcode 92、147、148


反转链表 II

leetcode 92 题
这道题就是反转区间链表,典中典
思路就是记录区间的前驱节点和后继节点,以及区间的左右边界
记录四个位置,之后进行拼接 将前驱节点和区间右边界相连,区间左边界和后继节点相连实现区间反转链表!

 public ListNode reverseBetween(ListNode head, int left, int right) {
        ListNode dummy=new ListNode(-1);
        dummy.next=head;
        ListNode prev=dummy; //待反转区间的前驱节点
        for(int i=1;i<left;i++){
            prev=prev.next;
        }
        ListNode leftNode=prev.next; //反转前左边界
        ListNode rightNode=prev; 
        for(int i=0;i<right-left+1;i++){
            rightNode=rightNode.next;
        }
        //找到了反转前的右边界
        ListNode tail=rightNode.next;
        //先进行切断连接,再反转,重新穿针引线
        prev.next=null;
        rightNode.next=null;
        reverse(leftNode);
        //拼接 将前驱节点拼接到反转后左边
        prev.next=rightNode;
        //将 反转链表右边界和 链表的尾部拼接
        leftNode.next=tail;
        return dummy.next;
    }
    public void reverse(ListNode head){
        if(head==null||head.next==null){
            return ;
        }
        ListNode cur=head;
        ListNode curNext=head.next;
        head.next=null;
        cur=curNext;
        while(cur!=null){
            curNext=curNext.next;
            cur.next=head;
            head=cur;
            cur=curNext;
        }
    }

排序链表

leetcode 148 题
模拟归并排序进行链表排序,都是找到中间节点将链表无限划分,最后和并两个链表

 public ListNode sortList(ListNode head) {
        //模拟归并排序 来排序
        if(head==null||head.next==null){
            return head;
        }
        ListNode fast=head.next;
        ListNode slow=head;
        //利用快慢指针来 找到中间节点
        while(fast!=null&&fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
        }
        ListNode mid=slow.next;
        //分为两部分链表 并断开 递归调用 
        slow.next=null;
        ListNode dummy=new ListNode(-1);
        ListNode res=dummy;
        ListNode left=sortList(head);
        ListNode right=sortList(mid);
        while(left!=null&&right!=null){
            if(left.val<=right.val){
                dummy.next=left;
                left=left.next;
            }else{
                dummy.next=right;
                right=right.next;
            }
            dummy=dummy.next;
        }
        dummy.next=left!=null?left:right;
        return res.next;
    }

对链表进行插入排序

leetcode 147题
利用插入排序的思想,认为第一个是有序的,从第二个节点为待插入的节点,定义前驱节点,
1.将有序节点的最后一个指向待插入节点的Next
2.将待插入节点的Next指向合适的位置
3.将前驱节点指向新插入的节点

public ListNode insertionSortList(ListNode head) {
        //模拟进行插入排序
        if(head==null||head.next==null){
            return head;
        }
        ListNode dummy=new ListNode(0);
        dummy.next=head;
        ListNode pre;
        while(head!=null&&head.next!=null){
            if(head.val<=head.next.val){
                head=head.next;
                continue;
            }
            pre=dummy;
            //给插入节点找到合适为插入位置
            while(pre.next.val<=head.next.val){
                pre=pre.next;
            }
            ListNode cur=head.next;//记录要插入的节点
            head.next=cur.next;
            cur.next=pre.next;
            pre.next=cur;
        }
        return dummy.next;
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值