首页 > 其他分享 >合并两个排序的链表

合并两个排序的链表

时间:2024-03-21 16:48:03浏览次数:18  
标签:ListNode cur val 合并 next 链表 l2 l1 排序

合并两个排序的列表

题目描述

输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。

数据范围

链表长度 [0,500][0,500]。

样例

输入:1->3->5 , 2->4->5

输出:1->2->3->4->5->5

代码实现

迭代版本

 struct ListNode {
     int val;
     ListNode *next;
     ListNode(int x) : val(x), next(NULL) {}
 };

class Solution {
public:
    ListNode* merge(ListNode* l1, ListNode* l2) {
      
        ListNode *dummy = new ListNode(0);
        ListNode *cur = dummy;
      
        while (l1 != NULL && l2 != NULL) {
            if (l1 -> val < l2 -> val) {
                cur -> next = l1;
                l1 = l1 -> next;
            }
            else {
                cur -> next = l2;
                l2 = l2 -> next;
            }
            cur = cur -> next;
        }
        cur -> next = (l1 != NULL ? l1 : l2);
        return dummy -> next;
    }
};

递归版本

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
    public :
        ListNode* merge(ListNode* l1, ListNode* l2) {
            if(!l1 || !l2) return (l1 != NULL ? l1 : l2);

            if(l1->val < l2->val) {
                l1->next = merge(l1->next, l2);
                return l1;
            }
            else{
                l2->next = merge(l1, l2->next);
                return l2;
            } 
        }
};

点评

  1. 迭代版本是新建了一个list。可以重点看看dummy节点的使用。还有一个亮点是cur -> next = (l1 != NULL ? l1 : l2); 这样子就比较简洁。自己在迭代版本也使用了相同的技巧。

  2. 迭代版本的处理比较新颖。自己的递归基没有想错,但是迭代的处理想错了。其实是对第一个节点讨论。

标签:ListNode,cur,val,合并,next,链表,l2,l1,排序
From: https://www.cnblogs.com/xuenima/p/18087684

相关文章

  • leedcode- 回文链表
    毫无创意的一版:#定义一个类SolutionclassSolution:#定义一个方法isPalindrome,用于检查链表是否为回文defisPalindrome(self,head:Optional[ListNode])->bool:#如果链表为空,则它是一个回文ifnothead:returnTrue......
  • 合并模型
    此功能在2.5.0及更高版本中可用您可以合并两个StableDiffusion模型(.ckpt或.safetensors格式),以组合两个不同模型的功能和艺术风格。步骤1打开MergemodelsUI顶部的选项卡:第2步选择两个模型文件(要合并的):重要提示:请合并相似类型的模型。例如,SD1.4仅具有SD1.4/1.5模型的......
  • P1347 排序
    原题链接题解1.\(A<B\)\(\to\)建立一条A向B的边2.由于数据范围小,所以可以输入一次进行一次拓扑遍历3.如果存在矛盾,说明存在环4.对于拓扑排序进行层次标记,如果最大层等于n,代表每个字母层次分明,有先后次序code#include<bits/stdc++.h>usingnamespacestd;vector<int>G[......
  • WPS WORD EXCEL 不合并显示
    WPSWORDEXCEL不合并显示 版本:WPS12,下载时间约是2023年。 1.在开始菜单里找到WPSOFFICE-配置工具2.点击“高级(A)”。3.在“其他选项”选项卡中,点击“切换到旧版的多组件模式”。4.选择“多组件模式”,然后确定。11......
  • 【数据结构和算法初阶(C语言)】二叉树的顺序结构--堆的实现/堆排序/topk问题详解---二
     目录 ​编辑1.二叉树的顺序结构及实现1.1二叉树的顺序结构2堆的概念及结构3堆的实现3.1堆的代码定义3.2堆插入数据3.3打印堆数据3.4堆的数据的删除3.5获取根部数据3.6判断堆是否为空3.7堆的销毁 4.建堆以及堆排序 4.1堆排序---是一种选择排序4.2升......
  • qsort实现函数排序(2)
    qsort实现结构体排序#include<stdio.h>#include<stdlib.h>#include<string.h>structstu{ charname[20]; intage;};intcmp_by_name(void*p1,void*p2){ returnstrcmp(((structstu*)p1)->name,((structstu*)p2)->name);}voidprint(s......
  • 插入排序
    插入排序1.解决的问题在已经排好序的序列中,插入一个新元素,让序列依旧保持有序,如优先级队列2.核心知识0个或者1个元素,已经是排好序的交换位置的条件(升序):当前元素比后者大(sequeue[i]>sequeue[i+1])当前元素比前者小(sequeue[i]<sequeue[i-1])2层循环第1层:准......
  • c#实现图的拓扑排序
    原文链接:https://blog.csdn.net/MfuuJava/article/details/132933517拓扑排序是一种在有向无环图(DAG)中对节点进行排序的算法。在C#中,我们可以使用深度优先搜索(DFS)和拓扑排序算法来解决这个问题。深度优先代码:usingSystem;usingSystem.Collections.Generic;classGraph......
  • 归并排序算法 java实现
    publicstaticvoidmain(String[]args){int[]arr={9,5,7,3,1,6,8,4,2};mergeSort(arr,0,arr.length-1);}/***归并排序*注意:归并的拆分数组和合并数组是从左到右依次进行的,网上很多文章都是错误的*并不是左右一起拆分,网上很多文章都是这样的......
  • 11--插入排序
    算法描述:从当前位置开始,从后往前找比当前数字小的,插入到这个小的数字的后面,在找的过程中,如果发现一个比当前数字大,同时将这个数字往后挪动,其中从后往前是重点。插入排序的时间复杂度是,特别地,若完全有序则时间复杂度为空间复杂度为,并且它是稳定的。插入排序的特点:越有序越快......