首页 > 其他分享 >【LeetCode剑指offer 03】合并两个/K个排序链表

【LeetCode剑指offer 03】合并两个/K个排序链表

时间:2023-04-18 13:34:18浏览次数:43  
标签:03 head ListNode offer next 链表 l2 l1

合并两个排序链表

https://leetcode.cn/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof

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

示例1:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
限制:

0 <= 链表长度 <= 1000

思路

代码

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        //两个指针遍历链表,比较,不断把小的那个接到新链表的后面
        //定义dummy,新链表头节点指向dummy
        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;
    }
};

合并K个升序链表

https://leetcode.cn/problems/merge-k-sorted-lists

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

示例 2:

输入:lists = []
输出:[]

示例 3:

输入:lists = [[]]
输出:[]

思路

在合并两个链表的基础上改一下就行

定义一个节点指向空指针,用于充当合成后链表的头节点

遍历所给的链表数组,不断调用合并两个链表时的函数即可

代码

class Solution {
private:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        //两个指针遍历链表,比较,不断把小的那个接到新链表的后面
        //定义dummy,新链表头节点指向dummy
        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;
    }
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        //创建合并链表的头节点
        ListNode* head = nullptr;//注意,这里不能用ListNode* head = new ListNode();来初始化
        //上述初始化方式会将head指向一个值为0,next为nulptr的节点对象,而我们希望head初始化并且不指向任何对象

        for(int i = 0; i < lists.size(); ++i){
            head = mergeTwoLists(head, lists[i]);
        }
        return head;
    }
};

ListNode* head = nullptr;和ListNode* head = new ListNode();有什么区别?

ListNode* head = nullptr; 定义了一个指针 head,并将其初始化为空指针。此时 head 不指向任何一个节点,即它的值为 nullptr。

ListNode* head = new ListNode(); 定义了一个指针 head,并通过 new 运算符分配了内存来创建一个新的 ListNode 节点。此时 head 指向这个新节点的地址。该节点的值可能是随机的,取决于默认构造函数中的初始化。

总之,两者的区别是一个指针被初始化为空指针,而另一个指针被初始化为指向一个新节点。

标签:03,head,ListNode,offer,next,链表,l2,l1
From: https://www.cnblogs.com/DAYceng/p/17329234.html

相关文章

  • NFO1113 / COMP9003
    INFO1113/COMP9003AssignmentDue:14May2023,11:59PMAESTThisassignmentisworth18%ofyourfinalgrade.TaskDescriptionInthisassignment,youwillcreateagameintheJavaprogramminglanguageusingtheProcessinglibraryforgraphicsandgradle......
  • 移除链表元素
    移除链表元素203.移除链表元素给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]Python解一:#Definitionforsingly-linkedlist.#classLi......
  • 剑指 Offer 45. 把数组排成最小的数
    题目链接:剑指Offer45.把数组排成最小的数方法:排序解题思路将数字转化为字符串数组,然后\(sort()\);cmp()函数staticboolcmp(stringa,stringb){returna+b<b+a;}代码//写法一classSolution{public:staticboolcmp(stringa,stringb){......
  • ERROR 1045 (28000): Access denied for user '-root'@'localhost' (using password:
    以下是cmd的操作(重启服务,修改my.ini文章下面有my.ini配置) 当修改密码为123456是sqlyog连接成功修改为root时连接报老错误,又修改为123456在修改为root就连接正常了MicrosoftWindows[版本10.0.18363.1139](c)2019MicrosoftCorporation。保留所有权利。C:\ProgramFiles......
  • 学习记录:第三周day03笔记
    通讯录项目:姓名、性别、电话,最多存储50个联系人功能:1、添加新联系人2、按名字删除联系人3、按名字修改联系人4、查找联系人,名字或电话,支持模糊查询5、显示所有联系人信息6、退出系统  预处理指令:程序员所编写的代码不能被真正的编译器所编译,需要先经过一段......
  • 【剑指 Offer】67. 把字符串转换成整数
    【题目】写一个函数StrToInt,实现把字符串转换成整数这个功能。不能使用atoi或者其他类似的库函数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起......
  • STM32F103与407区别
    STM32F103与407区别......
  • Oracle 单进程可用PGA为4G限制导致的ORA-4030报错
    一、问题背景收到开发反馈,系统报表运行过程中报错,一看发现是ORA-4030,内存的问题查看alert日志,发现期间有大量ORA-4030报错,并且主要是pga相关的打开trace文件,可以看到报错进程使用内存接近4G但是查看pga参数设置,发现设置的上限是20G,完全没到,并且期间总的PGA使用率也不高 二、报错......
  • P1996 约瑟夫问题-循环链表方法
    题目描述n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 n−1 名小朋友,而该题是全部......
  • Hackers' Crackdown UVA11825
    你需要将n个集合分成尽量多组,使得每一组里面所有集合的并集等于全集  32122022014111013120   f[S]=max(f[S],f[S-j]+1)且j是一个包含所有点的集合#include<iostream>#include<algorithm>#include<cstring>usingname......