首页 > 编程语言 >【C++】给定两个增序的链表,试将其合并成一个增序的链表。

【C++】给定两个增序的链表,试将其合并成一个增序的链表。

时间:2024-02-12 13:56:27浏览次数:22  
标签:ListNode head2 head1 C++ next 链表 增序 new

给定两个增序的链表,试将其合并成一个增序的链表。

#include <iostream>
#include <stack>
using namespace std;
struct ListNode {
  int val;
  ListNode* next;
  ListNode(int x) :val(x), next(nullptr) {}
};
void printList(ListNode* head) {
  while (head) {
    std::cout << head->val << " ";
    head = head->next;
  }
  std::cout << std::endl;
}
ListNode* mergeTwoLists(ListNode* head1, ListNode* head2) {
  ListNode* head3 = new ListNode(0);
  ListNode* tail = head3;
  while (head1 && head2) {
    if (head1->val <= head2->val) {
      tail->next = head1;
      head1 = head1->next;
    }
    else {
      tail->next = head2;
      head2 = head2->next;
    }
    tail = tail->next;
  }
  tail->next = head1 ? head1 : head2;
  return head3->next;
  /*
  head3被初始化为一个新的ListNode对象,这个对象并不包含任何实际的数据值(通常为0或某个哨兵值),它的主要作用是作为合并后链表的头部。在释放内存时,我们也需要从head3->next开始释放,跳过哨兵节点。这是因为在某些实现中,哨兵节点可能不会被释放,因为它可能在其他地方还有用途,或者它可能被用作一个永久的头部节点。
  */
}
int main() {
    // 创建链表1: 1 -> 2 -> 4  
  ListNode* head1 = new ListNode(1);
  head1->next = new ListNode(2);
  head1->next->next = new ListNode(4);

  // 创建链表2: 1 -> 3 -> 4  
  ListNode* head2 = new ListNode(1);
  head2->next = new ListNode(3);
  head2->next->next = new ListNode(4);

  std::cout << "List 1: ";
  printList(head1);
  std::cout << "List 2: ";
  printList(head2);

  ListNode* mergedHead = mergeTwoLists(head1, head2);
  std::cout << "Merged List: ";
  printList(mergedHead);

  // 释放内存  
  ListNode* current = mergedHead;
  while (current) {
    ListNode* next = current->next;
    delete current;
    current = next;
  }

  return 0;
}

标签:ListNode,head2,head1,C++,next,链表,增序,new
From: https://www.cnblogs.com/smartlearn/p/18013868

相关文章

  • 【C++】假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
    题目:假设链表中每一个节点的值都在0-9之间,那么链表整体就可以代表一个整数。给定两个这种链表,请生成代表两个整数相加值的结果链表。数据范围:0≤n,m≤1000000,链表任意值0≤val≤9要求:空间复杂度O(n),时间复杂度O(n)例如:链表1为9->3->7,链表2为6->3,最后生成新的结果链表......
  • C++11 用户定义字面量
    C++11用户定义字面量C++11引入了一项功能,称为用户自定义字面量(user-definedliterals),它允许程序员定义自己的字面量后缀,以扩展现有的字面量语法。内置字面量C++自带4种字面量:整形123浮点型12.3字符'1'字符串"123"字面量又可添加后缀来表明具体类型,建议大写:无符......
  • 【C++】STL string类例题新思路记录(编写一个程序,告诉用户输入的句子包含多少个元音字
    题干:编写一个程序,告诉用户输入的句子包含多少个元音字母。 方案一:1、创建一个普通函数,依次传入5个元音字母对查找字符串进行检测。2、函数通过依次传入的单个元音字母,循环查找整个字符串最后返回统计值。1#include<string>2#include<iostream>3usingnamespace......
  • 力扣递归 两道简单题合成一道中等题之148. 排序链表
    递归归并排序,先找到终点,再合并两个链表 给你链表的头结点 head ,请将其按升序排列并返回排序后的链表。 示例1:输入:head=[4,2,1,3]输出:[1,2,3,4]示例2:输入:head=[-1,5,3,4,0]输出:[-1,0,3,4,5]示例3:输入:head=[]输出:[]/** *Definitionforsingl......
  • 力扣快慢双指针之876. 链表的中间结点
    给你单链表的头结点head,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 示例1:输入:head=[1,2,3,4,5]输出:[3,4,5]解释:链表只有一个中间结点,值为3。示例2:输入:head=[1,2,3,4,5,6]输出:[4,5,6]解释:该链表有两个中间结点,值分别为3......
  • C++Primer
    前言固然,轻薄短小的书籍乍见之下让所有读者心情轻松,但如果舍弃太多应该深入的地方不谈,也难免令人行止失据,进退两难。……作为一个好的学习者,背景不是重点,重要的是,你是否具备正确的学习态度。起步固然可从轻松小品开始,但如果碰上大部头巨著就退避三舍、逃之夭夭,面对任何技术只......
  • C++OpenCV 按之前图片名称保存图片
    C++OpenCV按之前图片名称保存图片://图片地址cv::Stringpattern="./path/*.jpeg";//可以使用cv::glob函数来获取匹配模式的文件路径列表std::vector<cv::String>file_paths;cv::glob(pattern,file_paths);for(size_ti=0;i<file_paths.size();i++){//......
  • c++ OpenCV 读取某个文件夹下的所有图片
    方案一:将文件夹中图像遍历到vector中#include<vector>#include<opencv2/imgproc.hpp>#include<opencv2/highgui.hpp>std::vector<cv::Mat>ReadImage(cv::Stringpattern){std::vector<cv::String>fn;cv::glob(pattern,fn,false);......
  • 力扣递归之21. 合并两个有序链表
    将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。  示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0]classSolution{publicListN......
  • 【c&c++】#define 宏的高级用法二
    一,宏的定义与撤销#普通宏定义#definePI3.14//编译阶段替换掉宏#defineT13+4//容易产生歧义#defineT2(3+4)//添加括号后,语义清楚floatr=1.0;floatarea=PI*r*r;inta=2*T1#宏替换后变成inta=2*3+4不符合本意inga......