单向链表归并排序 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. **链表的复制**:创建链表的副本,需要遍历原链表并为每个节点创建新...
链表还常用于实现各种算法,如快速排序和归并排序中的链表版本,以及用于解决哈夫曼编码等数据压缩问题。 在编程语言中,如C、C++、Java和Python等,都提供了对链表操作的支持。在高级语言中,通常使用封装好的类来...
稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、...
7. 合并链表:将两个已排序的链表合并成一个有序链表,这是一种常见的链表操作。 这些代码示例可能采用不同的编程语言,如C、C++、Java或Python,每种语言对于链表的实现和操作都有其独特的语法和特点。通过学习和...
链表分为单向链表和双向链表,单向链表只能从前往后遍历,而双向链表可以向前或向后遍历。 实验内容可能包括以下部分: 1. **链表的创建**:首先,我们需要创建一个链表结构,这通常涉及到定义节点类,包括数据和...
源程序通常包括初始化链表、添加节点、删除节点、打印链表等函数,有时还会包含对链表的高级操作,如反转链表、查找元素、合并排序链表等。 循环链表是链表的一种变体,它的最后一个节点指针指向第一个节点,形成一...
链表的种类繁多,包括单向链表、双向链表以及循环链表等,根据不同的应用场景选择合适的链表结构。 树是一种层次化结构,由节点和边组成,其中每个节点可以有零个或多个子节点。树结构在计算机科学中应用广泛,例如...
- 归并排序:采用分治策略,将大问题分解为小问题,然后合并结果。时间复杂度为O(n log n),空间复杂度较高。 - 快速排序:选取一个基准值,将数组分为两部分,小于基准的放在左边,大于的放在右边,然后递归地对...
链表分为单向链表、双向链表和循环链表等类型。链表的优势在于它的动态性质,即可以在运行时动态地添加或删除节点,而不需要像数组一样预先分配固定大小的存储空间。链表的访问时间复杂度为O(n),因为需要从头节点...
链表是一种基础且重要的数据结构,它在计算机科学中扮演着不可或缺的角色,特别是在处理动态数据集合时。...同时,你也可以探索更多关于链表的高级主题,如循环链表、链表的合并排序等,进一步提升你的编程技能。