前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >148. 排序链表

148. 排序链表

作者头像
名字是乱打的
发布2021-12-23 19:01:52
1640
发布2021-12-23 19:01:52
举报
文章被收录于专栏:软件工程软件工程

思路:

归并排序

  • 递归的终止条件是链表的节点个数小于或等于 1,即当链表为空或者链表只包含 11个节点时,不需要对链表进行拆分和排序。
  • 找到链表重点,对链表进行拆分,分别排序,返回两个链表的首结点,对于链表中点的找法可以采用快慢指针,快指针一次走两步,满指针一次走一步,快指针走到最后一个节点的额时候慢指针所在位置为中点
  • 最后合并连个有序链表

代码:

代码语言:javascript
复制
class Solution {
        public ListNode sortList(ListNode head) {
            return sortList(head, null);
        }

        //对收尾为head和tail的链表进行排序
        public ListNode sortList(ListNode head, ListNode tail) {
            if (head == null) {
                return null;
            }

            //区间范围,前闭后开 [mid, tail),tail不包含在内。
            //如果只有一个结点了就不需要再拆了
            if (head.next == tail) {
                head.next=null;
                return head;
            }

            //找到中间结点
            //快指针一次走两步,慢指针一次走一步,快指针到链表末尾时候
            //慢指针指向链表中间位置
            ListNode quick=head,slow=head;
            while (quick!=tail){
                quick=quick.next;
                slow=slow.next;
                //防null,直到quick走到最后一个结点
                if (quick!=tail){
                    quick=quick.next;
                }
            }
            //区间范围,前闭后开 [mid, tail),tail不包含在内。
            ListNode listNode1 = sortList(head, slow);
            ListNode listNode2 = sortList(slow, tail);
            //合并两个有序链表,返回合并链表头结点
            ListNode res=merge(listNode1,listNode2);
            return res;
        }


        //合并两个有序链表,返回合并链表头结点
        private ListNode merge(ListNode listNode1, ListNode listNode2) {
            ListNode pre=new ListNode(0);
            ListNode curr=pre,temp1=listNode1,temp2=listNode2;
            while (temp1!=null&&temp2!=null){
                if (temp1.val<temp2.val){
                    curr.next=temp1;
                    temp1=temp1.next;
                }else {
                    curr.next=temp2;
                    temp2=temp2.next;
                }
                curr=curr.next;
            }

            if (temp1==null){
                curr.next=temp2;
            }
            if (temp2==null){
                curr.next=temp1;
            }
            return pre.next;
        }
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021/10/29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思路:
  • 代码:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档