首页 > 其他分享 >链表归并排序

链表归并排序

时间:2023-06-01 17:31:51浏览次数:36  
标签:归并 ListNode val lists next 链表 result l1 排序


输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
         if(pHead1==nullptr)
         {
             return pHead2;
         }
         if(pHead2==nullptr)
         {
             return pHead1;
         }        
        ListNode* res=nullptr;
        if(pHead1->val>=pHead2->val)
        {
            res=pHead2;
            res->next=Merge(pHead1,pHead2->next);
        }
        else
        {
            res=pHead1;
            res->next=Merge(pHead1->next,pHead2);
        }
        return res;
    }
};

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *mergeTwoLists(ListNode* l1, ListNode* l2) 
    {
        ListNode  dummy(-1); 
        ListNode *result = &dummy;
        while(l1 && l2)
        {
            if(l1->val <= l2->val)
            {
                result->next = l1;
                result = result->next;
                l1 = l1->next;
            }
            else
            {
                result->next = l2;                
                result = result->next;
                l2 = l2->next;
            }            
        }
        if(l1)
            result->next = l1;
        else if(l2)
            result->next = l2;
        return dummy.next;
    }

    ListNode *mergeKLists(vector<ListNode *> &lists) 
    {
        if (lists.empty()) return NULL;
        int len = lists.size();
        while (len > 1) 
        {
            for (int i = 0; i < len / 2; ++i) 
            {
                lists[i] = mergeTwoLists(lists[i], lists[len - 1 - i]);
            }
            len = (len + 1) / 2;
        }
        return lists.front();
    }
};


标签:归并,ListNode,val,lists,next,链表,result,l1,排序
From: https://blog.51cto.com/u_16147764/6396720

相关文章

  • 链表的相关操作
    链表的相关操作#pragmaonce//编程的接口(API)//*.h文件中一般会放:类型的定义,函数的声明,全局变量#include<stdbool.h>typedefstructnode{ intval; structnode*next;}Node;typedefstruct{ Node*head; Node*tail; intsize;}List;List*create_......
  • python 合并k个有序链表
     fromheapqimportheappush,heappopclassSolution:defmergeKLists(self,lists):q=[]fori,headinenumerate(lists):ifhead:heappush(q,(head.val,i,head))node=dummy=ListNode(0)......
  • 合并两个有序链表
     将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。  经典算法,采用递归法就行了,别的算法也有,但有限考虑能想得到的。每次将两个头节点值较小的链表 l1 和 l2 中的头结点合并,并返回合并后的头结点,递归地进行下去,直到......
  • Go排序算法小总结
    Go-排序算法参考整理:1.0十大经典排序算法|菜鸟教程(runoob.com)shell排序-Mohuishou(lailin.xyz)排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部......
  • iOS-高仿通讯录之商品索引排序搜索
    概述TableView添加右侧索引,将数据按照索引分组排序,并添加搜索功能且在搜索界面复用当前页面.详细项目中像一些商品搜索类界面,TableView添加右侧索引的使用越来越多,的确用户体验提高了许多.一、主要思路大致思路:1.添加并设置右侧索引2.自定义汉字转化成拼......
  • 各种排序的原理
    1.选择排序: 首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换; 再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换; 重复上述操作,共进行n-1趟排序后,排序结束。voidSelesort(int*Array,intn){inti,j,k,tmp;......
  • 初级数据结构--单链表
    继昨天终于明白了成功截图typedefstructLNode{ intdata; structLNode*next;}LNode;boolIsitList(LNode**Head){ *Head=(LNode*)malloc(sizeof(LNode)); if(!*Head) returnfalse; (*Head)->next=NULL; returntrue;}voidListInsert(LNode*L,intval......
  • 2.单向链表
    1.为什么需要链表?  链表是一种灵活的数据结构,它允许在内存中动态地存储和操作元素。以下是一些需要使用链表的原因:1.动态数组的缺点:数组的大小是在程序运行时固定的,如果需要添加或删除元素,就需要重新分配内存并复制数据。这会导致大量的内存浪费和性能问题。而链表可以动态地......
  • 算法:排序算法-选择排序
       ......
  • 算法:排序算法-冒泡排序
        ......