链表的排序----链表的归并排序

链表的归并排序(LinkList merge sort)

首先来看看如果有两条已序(sorted)的链表 ListNode *A ,  和ListNode *B, 如何合并成一条已序的链表呢?

 ListNode * mergeTwoLists(ListNode *l1, ListNode *l2)
    {
       ListNode *head = new ListNode(-1);
       ListNode *p = head;

       for(;l1&&l2; p = p->next)
       {
           if(l1->val <l2->val)
           {
               p->next = l1;
               l1 =l1->next;
           }
           else
           {
               p->next = l2;
               l2 =l2->next;
           }

       }

         p->next = l1!=nullptr?l1:l2;
         return head->next;

    }

所以一条单链表的归并排序的思路如下: 同样是分治法

1.找到一条链表的中点节点,从中点节点断开成两条链表。

2.分别对前半部分链表和后半部分链表进行 链表的归并排序。

3.得到两部分已经排序的链表,最后进行归并链表

程序如下: leetcode  accepted

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* sortList(ListNode* head) {
    if(head==nullptr|| head->next ==nullptr) return head;
        // get the len of the list
        ListNode * fast = head;
        ListNode * slow = head;

        while(fast->next!=nullptr&&fast->next->next!=nullptr)
        {
            fast = fast->next->next;
            slow = slow->next;

        }

        fast = slow;       // find the mid of the linklist
        slow = slow->next;
        fast->next = nullptr; // cut the list to two parts;

        ListNode *l1 = sortList(head);
        ListNode *l2 = sortList(slow);

        return mergeTwoLists(l1,l2);
    }

    ListNode * mergeTwoLists(ListNode *l1, ListNode *l2)
    {
       ListNode *head = new ListNode(-1);
       ListNode *p = head;

       for(;l1&&l2; p = p->next)
       {
           if(l1->val <l2->val)
           {
               p->next = l1;
               l1 =l1->next;
           }
           else
           {
               p->next = l2;
               l2 =l2->next;
           }

       }

         p->next = l1!=nullptr?l1:l2;
         return head->next;

    }

};
时间: 2024-10-09 00:57:29

链表的排序----链表的归并排序的相关文章

链表-删除排序链表中的重复元素

leetcode(使用的是中文网站:领扣):83 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4->5 输出: 1->2->5 示例 2: 输入: 1->1->1->2->3 输出: 2->3 一开始没有看到排序链表这个条件,所以解法有一点麻烦 解法一: 思路:再创建一个链表B,然后遍历原来的链表A,将A中的元素添加到B的链表尾部. 每

链表的排序 ---链表插入排序

链表的插入排序 Insertion Sort List 1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.而对有链表,没有办法随机读取.所以插入排序,对每一个节点来说,只能从头节点开始,慢慢的向后开始比较,如果找到位置则将节点插入序列中. 代码如下,leetcode accept. /** * Definition for singly-linked list. * struct ListNod

单链表的排序 快速排序 归并排序 quicksort mergesort

原理都很简单,关键是某些边界能否正确写对: #include<iostream> #include<stdio.h> using namespace std; class Node { public: int val; Node* next; Node(int val = 0):val(val),next(NULL){ } }; Node* quicksort(Node* head, Node* tail) { Node *res1 = NULL, *res2 = NULL; No

[Leetcode]148. 排序链表(归并排序)

题目 在?O(n?log?n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示例 2: 输入: -1->5->3->4->0 输出: -1->0->3->4->5 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/sort-list 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注

链表的排序(归并排序+快慢指针)

链表的排序有很多方式,这里记录一下归并排序,关键点2个: 归并排序的过程和快慢指针法找中间结点,直接上代码. class Solution { public: ListNode* sortList(ListNode* head) { if (!head || !head->next) return head; ListNode* slow = head, * fast = head->next; while (fast && fast->next) { slow = sl

链表插入排序、链表归并排序

1.链表 1.1链表的存储表示 //链表的存储表示 typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode, *LinkList; 1.2基本操作 创建链表: /* * 创建链表. * 形参num为链表的长度,函数返回链表的头指针. */ LinkList CreatLink(int num) { int i, data; //p指向当前链表中最后一个结点,q指向准备插入的结点.

【链表】Sort List(归并排序)

题目: Sort a linked list in O(n log n) time using constant space complexity. 思路: nlogn的排序有快速排序.归并排序.堆排序.双向链表用快排比较适合,堆排序也可以用于链表,单向链表适合用归并排序. /** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */

排序链表

中英题面 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. Sort a linked list in O(n log n) time using constant space complexity. 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 Example 1: Input: 4->2->1->3 Output: 1->2->3->4 示例 2: 输入: -1->5-&g

在o(N log N)时间内使用恒定的空间复杂度对链表进行排序

时间复杂度要求为o(N log N)所以,排序方法采用归并排序 代码如下 package sort; class ListNode {    int val;    ListNode next; ListNode(int x) {        val = x;        next = null;    }} public class TestListNode {        public ListNode sortList(ListNode head) {            if(h