常考数据结构与算法:单链表的排序

 题目描述

给定一个无序单链表,实现单链表的排序(按升序排序)。

 

输入

[1,3,2,4,5]

返回值

{1,2,3,4,5}

public class SortInListME {
    public static void main(String[] args) {
        ListNode l1 = new ListNode(1);  // 1,3,2,5,4
        ListNode l2 = new ListNode(3);
        ListNode l3 = new ListNode(2);
        ListNode l4 = new ListNode(5);
        ListNode l5 = new ListNode(4);
        l1.next = l2;
        l2.next = l3;
        l3.next = l4;
        l4.next = l5;

        SortInListME sortInListME = new SortInListME();
        ListNode resutl = sortInListME.sortInList2(l1);
        sortInListME.printList(resutl);
    }

    public void printList(ListNode head) {
        ListNode curNode = head;
        //循环遍历到尾节点
        while (curNode != null) {
            System.out.print(curNode.val + "  ");
            curNode = curNode.next;
        }
        System.out.println();
    }
    
    /*
    * 递归将链表分为两部分,每部分排好序以后,合并这两个排好序的链表即可 
    */
    public ListNode sortInList2 (ListNode head) {
        // write code here
        if (null == head || head.next == null) {
            return head;
        }
        ListNode p1 = head;
        ListNode p2 = head.next; // 1,3,2,5,4
        while (p2 != null && p2.next != null) {
            p1 = p1.next;
            p2 = p2.next.next;
        }
        ListNode p2Head = sortInList2(p1.next);
        p1.next = null;
        ListNode p1Head = sortInList2(head);
        ListNode pre = new ListNode(0);
        ListNode ansPre = pre;
        while (p1Head != null && p2Head != null) {
            if (p1Head.val < p2Head.val) {
                pre.next = p1Head;
                p1Head = p1Head.next;
            } else {
                pre.next = p2Head;
                p2Head = p2Head.next;
            }
            pre = pre.next;
        }
        pre.next = p1Head == null ? p2Head : p1Head;
        return ansPre.next;
    }

    /**
     * 下面的方法,只能替换节点中的值,不能替换实际的节点
     * @param head ListNode类 the head node
     * @return ListNode类
     */
    public ListNode sortInList (ListNode head) {

        int temp;
        ListNode curNode = head;
        while(null != curNode){

            // 内循环从当前节点的下一个节点开始
            ListNode nextNode = curNode.next;
            while(null != nextNode){
                if(nextNode.val < curNode.val){
                    temp = curNode.val;
                    curNode.val = nextNode.val;
                    nextNode.val = temp;
                }

                nextNode = nextNode.next;
            }

            curNode = curNode.next;
        }

        return head;
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构与算法八股文是一个常见的面试问题,主要考察对数据结构和算法的理解和应用能力。以下是一个典型的数据结构与算法八股文: 1. 数组 - 数组的特点和使用场景 - 常见的数组操作:增删改查、旋转、反转等 - 数组的时间复杂度和空间复杂度分析 2. 链表 - 链表的特点和种类:单链表、双链表、循环链表等 - 常见的链表操作:插入、删除、反转、合并等 - 链表的时间复杂度和空间复杂度分析 3. 栈和队列 - 栈和队列的特点和应用场景 - 栈和队列的实现方式:数组实现、链表实现等 - 常见的栈和队列操作:入栈、出栈、入队、出队等 4. 树和二叉树 - 树和二叉树的特点和应用场景 - 树和二叉树的遍历方式:前序、中序、后序、层次遍历等 - 常见的树和二叉树操作:插入、删除、查找等 5. 图 - 图的特点和应用场景 - 图的表示方式:邻接矩阵、邻接表等 - 常见的图算法:深度优先搜索、广度优先搜索、最短路径、最小生成树等 6. 排序算法 - 常见的排序算法:冒泡排序、插入排序、选择排序、快速排序、归并排序等 - 排序算法的时间复杂度和稳定性分析 - 如何选择合适的排序算法 7. 查找算法 - 常见的查找算法:顺序查找、二分查找、哈希查找等 - 查找算法的时间复杂度和空间复杂度分析 - 如何选择合适的查找算法 8. 动态规划 - 动态规划的基本思想和应用场景 - 动态规划问题的特征和求解方法 - 如何优化动态规划问题的时间复杂度

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值