单向链表归并排序 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 public class ListNode { int val; // 节点值 ...
5. **合并两个有序链表**:这是另一个链表问题,目标是将两个已排序的链表合并成一个有序链表。可以使用迭代方法: ```java public ListNode mergeSortedLists(ListNode l1, ListNode l2) { ListNode mergedHead =...
排序可以使用插入排序或归并排序,平均分可以通过遍历链表累加所有分数后除以学生数量得到。 总的来说,刘小晶教授的例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. **链表的基本操作**:创建链表、插入节点、删除节点、遍历链表。这些操作是进行链表合并的基础...
- 排序:链表可以使用各种排序算法进行排序,如插入排序、归并排序等。 6. **链表与数组的比较**: 链表在空间上比数组更灵活,可以动态调整大小,而数组一旦创建大小固定。链表的插入和删除操作更快,但访问速度...
7. 合并两个排序的链表:合并两个已排序的链表,保持结果排序。 在解决这些例题时,学生需要深入理解链表的内部工作原理,包括节点的创建、引用的传递以及对指针的操作。同时,这也有助于学生熟悉Java集合框架的...
单向链表只能按一个方向遍历,双向链表可以从两个方向遍历,循环链表的最后一个节点指向第一个节点,形成环状。 2. **链表的常见操作** - 插入:在链表头部、尾部或指定位置插入新节点。 - 删除:根据节点值或...
链表的主要类型有单向链表、双向链表和循环链表。在Java中,可以使用类来表示链表节点,每个节点包含数据和指向下一个节点的引用。 2. **栈**:栈是一种后进先出(LIFO)的数据结构,常用于函数调用、表达式求值等...
7. 合并链表:将两个已排序的链表合并成一个有序链表。 在实际应用中,链表常用于实现堆栈、队列、哈希表和图形算法等数据结构和算法。例如,栈可以使用单向链表实现,通过在链表头部进行插入和删除操作;队列则...
8. **链表的排序**:链表可以使用各种排序算法进行排序,如冒泡排序、插入排序、归并排序等,但链表的特性使得一些算法更高效,如归并排序。 9. **链表的复制**:创建链表的副本,需要遍历原链表并为每个节点创建新...
7. 合并链表:将两个已排序的链表合并成一个有序链表,这是一种常见的链表操作。 这些代码示例可能采用不同的编程语言,如C、C++、Java或Python,每种语言对于链表的实现和操作都有其独特的语法和特点。通过学习和...
稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、...
链表分为单向链表和双向链表,单向链表只能从前往后遍历,而双向链表可以向前或向后遍历。 实验内容可能包括以下部分: 1. **链表的创建**:首先,我们需要创建一个链表结构,这通常涉及到定义节点类,包括数据和...
源程序通常包括初始化链表、添加节点、删除节点、打印链表等函数,有时还会包含对链表的高级操作,如反转链表、查找元素、合并排序链表等。 循环链表是链表的一种变体,它的最后一个节点指针指向第一个节点,形成一...
- 归并排序:采用分治策略,将大问题分解为小问题,然后合并结果。时间复杂度为O(n log n),空间复杂度较高。 - 快速排序:选取一个基准值,将数组分为两部分,小于基准的放在左边,大于的放在右边,然后递归地对...
链表是一种基础且重要的数据结构,它在计算机科学中扮演着不可或缺的角色,特别是在处理动态数据集合时。...同时,你也可以探索更多关于链表的高级主题,如循环链表、链表的合并排序等,进一步提升你的编程技能。
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 线索二叉树 ...
链表有单向链表、双向链表和循环链表等多种形式,适合动态增加或删除元素。 3. **栈**:栈是一种后进先出(LIFO)的数据结构,常用于函数调用、表达式求值等场景。Java中,`java.util.Stack`类提供了栈的操作。 4....
链表包括单向链表、双向链表和循环链表等类型。Java中的`LinkedList`类就是链表的一种实现,它提供了插入、删除、遍历等操作,适合频繁进行插入和删除操作的情况。 3. **散列(哈希)**:散列是一种将任意大小的...