题解 | #单链表的排序#

单链表的排序

https://www.nowcoder.com/practice/f23604257af94d939848729b1a5cda08

public ListNode sortInList(ListNode head) {
        //递归出口
        if(head == null || head.next == null) return head;
        //获取到传递进来的head链表的中点
        //使用快慢指针的方式
        ListNode fast = head.next;
        ListNode slow = head;
        while(fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }
        //循环借宿 slow慢指针指向的就是中点
        ListNode temp = slow.next;
        slow.next = null;
        //获取到左右两边的节点
        ListNode left = sortInList(head);
        ListNode right = sortInList(temp);
        //创建新的链表
        ListNode h = new ListNode(0);
        ListNode res = h;
        //合并左右两边两个链表
        while(left != null && right != null){
            if(left.val <= right.val){
                h.next = left;
                left = left.next;
            }else{
                h.next = right;
                right = right.next;
            }
            h = h.next;
        }
        //最后添加未对比的链表部分 判断左边的链表是否有空位
        h.next = left != null ? left:right;
        return res.next;
}

解题思路:利用二分法的思想,不管这个链表有多长,递归分一半,分到最后得到很多两个一组的链表,对两个一组的链表之间的排序就应该得心应手啦

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务