`
stephen4留雨
  • 浏览: 20456 次
文章分类
社区版块
存档分类
最新评论

单向链表归并排序 Java

 
阅读更多

单向链表归并排序 use Java

链表的关键在于递归的时候中间位置的确定,方法是:用两个指针p,f 遍历链表,p走一步而f走两步;当f走完的时候p走到链表的一半!

这让我烧绳子那道逻辑题。

代码如下

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode sortList(ListNode head) {
        
        if (head == null || head.next == null){
            return head;
        }
        
        ListNode p = head;
        ListNode f = head.next;
        while ( f.next !=null && f.next.next !=null ){//locate p at half of the ListNode
            p = p.next;
            f = f.next.next;
        }
        
        ListNode h2 = sortList(p.next);
        p.next = null;
        
        return merge( sortList (head) , h2 );
        
    }
    
    public ListNode merge(ListNode h1,ListNode h2){
        
        ListNode hn = new ListNode(-1);
        ListNode c = hn;
        
        while (h1 != null && h2 != null ){
            if (h1.val <= h2.val){
                c.next = h1;
                h1 = h1.next;
            }else {
                c.next = h2;
                h2 = h2.next;
            }
            c = c.next;
        }
        
        if(h1 == null){
            c.next = h2;
        }else{
            c.next = h1;
        }
        
        return hn.next;
        
    }
}


分享到:
评论

相关推荐

    java链表反转及排序

    在“java链表反转及排序”这个主题中,我们将探讨如何在Java中实现单向链表的反转和排序。首先,我们创建一个链表节点类,包含数据和指向下一个节点的引用: ```java public class ListNode { int val; // 节点值 ...

    Java算法(链表操作实例)

    5. **合并两个有序链表**:这是另一个链表问题,目标是将两个已排序的链表合并成一个有序链表。可以使用迭代方法: ```java public ListNode mergeSortedLists(ListNode l1, ListNode l2) { ListNode mergedHead =...

    数据结构—刘小晶—例2.7-用链表结构写的学生成绩管理系统

    排序可以使用插入排序或归并排序,平均分可以通过遍历链表累加所有分数后除以学生数量得到。 总的来说,刘小晶教授的例2.7通过一个实际的应用场景,让我们直观地理解了链表数据结构在处理动态数据集合时的优势,...

    冒泡排序(单向、双向)

    以下是一个简单的单向冒泡排序的Java实现: ```java public class BubbleSort { public static void bubbleSort(int[] arr) { int n = arr.length; for (int i = 0; i ; i++) { // 外层循环控制排序轮数 for ...

    数据结构实验之链表合并

    链表分为单向链表、双向链表和循环链表等类型,根据实际需求选择合适的链表结构。 实验中可能涉及的知识点包括: 1. **链表的基本操作**:创建链表、插入节点、删除节点、遍历链表。这些操作是进行链表合并的基础...

    LinkedList:该项目提供了单向、双向和循环链表的示例

    - 排序:链表可以使用各种排序算法进行排序,如插入排序、归并排序等。 6. **链表与数组的比较**: 链表在空间上比数组更灵活,可以动态调整大小,而数组一旦创建大小固定。链表的插入和删除操作更快,但访问速度...

    山东大学大一高程JAVA链表例题.zip

    7. 合并两个排序的链表:合并两个已排序的链表,保持结果排序。 在解决这些例题时,学生需要深入理解链表的内部工作原理,包括节点的创建、引用的传递以及对指针的操作。同时,这也有助于学生熟悉Java集合框架的...

    leetcode-链表笔记

    单向链表只能按一个方向遍历,双向链表可以从两个方向遍历,循环链表的最后一个节点指向第一个节点,形成环状。 2. **链表的常见操作** - 插入:在链表头部、尾部或指定位置插入新节点。 - 删除:根据节点值或...

    常用数据结构及其算法的Java实现,包括但不仅限于链表、栈,队列,树,堆,图等经典数据结构及其他经典基础算法(如排序.zip

    链表的主要类型有单向链表、双向链表和循环链表。在Java中,可以使用类来表示链表节点,每个节点包含数据和指向下一个节点的引用。 2. **栈**:栈是一种后进先出(LIFO)的数据结构,常用于函数调用、表达式求值等...

    能直接用的链表

    7. 合并链表:将两个已排序的链表合并成一个有序链表。 在实际应用中,链表常用于实现堆栈、队列、哈希表和图形算法等数据结构和算法。例如,栈可以使用单向链表实现,通过在链表头部进行插入和删除操作;队列则...

    1_12313212313链表.7z

    8. **链表的排序**:链表可以使用各种排序算法进行排序,如冒泡排序、插入排序、归并排序等,但链表的特性使得一些算法更高效,如归并排序。 9. **链表的复制**:创建链表的副本,需要遍历原链表并为每个节点创建新...

    链表code-algorithm-linked-list-master

    链表还常用于实现各种算法,如快速排序和归并排序中的链表版本,以及用于解决哈夫曼编码等数据压缩问题。 在编程语言中,如C、C++、Java和Python等,都提供了对链表操作的支持。在高级语言中,通常使用封装好的类来...

    【超全!】图解Java数据结构和算法(共195集)【资料+视频+课件+代码+笔记】

    稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、...

    数据结构与算法-顺序表(链表篇)

    7. 合并链表:将两个已排序的链表合并成一个有序链表,这是一种常见的链表操作。 这些代码示例可能采用不同的编程语言,如C、C++、Java或Python,每种语言对于链表的实现和操作都有其独特的语法和特点。通过学习和...

    实验一链表及其应用.zip

    链表分为单向链表和双向链表,单向链表只能从前往后遍历,而双向链表可以向前或向后遍历。 实验内容可能包括以下部分: 1. **链表的创建**:首先,我们需要创建一个链表结构,这通常涉及到定义节点类,包括数据和...

    链表(实验报告,指导书,源程序)

    源程序通常包括初始化链表、添加节点、删除节点、打印链表等函数,有时还会包含对链表的高级操作,如反转链表、查找元素、合并排序链表等。 循环链表是链表的一种变体,它的最后一个节点指针指向第一个节点,形成一...

    基础的数据结构代码,包括排序,链表,树,图等。用java实现。后期会继续完善添加。_javaDS.zip

    链表的种类繁多,包括单向链表、双向链表以及循环链表等,根据不同的应用场景选择合适的链表结构。 树是一种层次化结构,由节点和边组成,其中每个节点可以有零个或多个子节点。树结构在计算机科学中应用广泛,例如...

    链表、队列、栈、二叉树、哈希表等

    - 归并排序:采用分治策略,将大问题分解为小问题,然后合并结果。时间复杂度为O(n log n),空间复杂度较高。 - 快速排序:选取一个基准值,将数组分为两部分,小于基准的放在左边,大于的放在右边,然后递归地对...

    java基本数据结构的实现,以及几种常用的排序算法的实现_java-dataStructure.zip

    链表分为单向链表、双向链表和循环链表等类型。链表的优势在于它的动态性质,即可以在运行时动态地添加或删除节点,而不需要像数组一样预先分配固定大小的存储空间。链表的访问时间复杂度为O(n),因为需要从头节点...

    链表

    链表是一种基础且重要的数据结构,它在计算机科学中扮演着不可或缺的角色,特别是在处理动态数据集合时。...同时,你也可以探索更多关于链表的高级主题,如循环链表、链表的合并排序等,进一步提升你的编程技能。

Global site tag (gtag.js) - Google Analytics