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

单向链表归并排序 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. **链表的复制**:创建链表的副本,需要遍历原链表并为每个节点创建新...

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

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

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

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

    实验一链表及其应用.zip

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

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

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

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

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

    链表

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

    数据结构(C语言版)\Java数据结构和算

    4.2 用C语言表示单向链表 4.3 链式栈与链式队列 4.4 多项式 4.5 其它链表操作 4.6 等价类 4.7 稀疏矩阵 4.8 双向链表 第5章 树 5.1 引论 5.2 二叉树 5.3 遍历二叉树 5.4 其它二叉树操作 5.5 线索二叉树 ...

    数据结构(Java版)源代码

    链表有单向链表、双向链表和循环链表等多种形式,适合动态增加或删除元素。 3. **栈**:栈是一种后进先出(LIFO)的数据结构,常用于函数调用、表达式求值等场景。Java中,`java.util.Stack`类提供了栈的操作。 4....

    Java各种算法大全

    链表包括单向链表、双向链表和循环链表等类型。Java中的`LinkedList`类就是链表的一种实现,它提供了插入、删除、遍历等操作,适合频繁进行插入和删除操作的情况。 3. **散列(哈希)**:散列是一种将任意大小的...

Global site tag (gtag.js) - Google Analytics