首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C++中合并两个链表的问题

在C++中合并两个链表的问题可以通过以下方式解决:

  1. 创建一个新的链表,用于存储合并后的结果。
  2. 定义两个指针,分别指向两个链表的头节点。
  3. 比较两个链表当前节点的值,将较小的节点添加到新链表中,并将指针向后移动一位。
  4. 重复步骤3,直到其中一个链表的指针为空。
  5. 将另一个链表剩余的节点直接添加到新链表的末尾。
  6. 返回新链表作为合并后的结果。

以下是一个示例代码:

代码语言:txt
复制
#include <iostream>

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

ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
    ListNode* dummy = new ListNode(0); // 创建一个虚拟头节点
    ListNode* curr = dummy; // 当前节点指针

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

    // 将剩余的节点直接添加到新链表的末尾
    if (l1) {
        curr->next = l1;
    }
    if (l2) {
        curr->next = l2;
    }

    ListNode* result = dummy->next; // 获取合并后的链表
    delete dummy; // 释放虚拟头节点的内存
    return result;
}

int main() {
    // 创建链表1: 1 -> 2 -> 4
    ListNode* l1 = new ListNode(1);
    l1->next = new ListNode(2);
    l1->next->next = new ListNode(4);

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

    // 合并两个链表
    ListNode* mergedList = mergeTwoLists(l1, l2);

    // 输出合并后的链表
    ListNode* curr = mergedList;
    while (curr) {
        std::cout << curr->val << " ";
        curr = curr->next;
    }
    std::cout << std::endl;

    // 释放链表的内存
    curr = mergedList;
    while (curr) {
        ListNode* temp = curr;
        curr = curr->next;
        delete temp;
    }

    return 0;
}

这个问题的解决方案是通过比较两个链表的节点值,逐个将较小的节点添加到新链表中,直到其中一个链表的指针为空。最后,将剩余的节点直接添加到新链表的末尾。这样可以保证合并后的链表仍然是有序的。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 块状链表

    的复杂度,而如果将整个块状链表维护成有序的,它甚至可以实现平衡树的一些操作[1],毕竟平衡树也可以看作是一种维护序列的方法。 又因为块状链表只在每个分块记录一些额外信息,它的空间利用率很高,而同是模拟方法的Splay需要在每个节点上维护全部额外信息,虽然速度比较快,却占用大量内存[2]。 其实,在日常生活中我们经常会用到块状链表:传统的FAT文件系统就是将磁盘扇区分簇,然后用FAT表(FileAllocation Table 文件分配表)来记录每一个簇的状态:是否损坏,是否被使用,如果被使用那么它的下一个簇是哪一个簇。可见,FAT文件系统的思想和块状链表是一致的。 而且因为块状链表空间利用率很高,分块的结构又能很方便的和缓冲区结合使用,Vim[3]也使用了块状链表,在内存的存储和在磁盘上的缓冲都使用了类似块状链表的结构[4]。试想如果用Splay去写一个文本编辑器会是多么复杂而抽象,它又如何方便地利用缓冲区,一旦发生崩溃、断电等意外事件,又如何从磁盘缓冲中重构树结构、恢复数据? 另外,已经有人在g++的<ext/rope>库中写了一个基本的块状链表模板:__gnu_cxx::rope<T, Alloc>,也就是说,使用C++的同学可以很方便的得到一个现成的块状链表[5]。

    02

    秋招时间规划,知识点汇总,以及面试总结一、知识储备二、面试问题三、心态变化四、总结

    秋招已结束,作为一个平时潜水的牛友,很感激牛客网和广大牛友们。在我无知时,给与我知识;在我烦恼时,给与我慰藉;现在自己也拿到了心仪的offer,就简单写写这段时间的知识储备、面试问题和心态方面的变化吧。也算是对自己秋招的一次总结。LZ水平一般,大佬看看就好了~ 一、知识储备 (LZ有整理一些内容,有兴趣的同学,私信我,我发给你) LZ本科是计算机专业的,考研的时候看的王道四本专业书,于是我又温习了一遍:数据结构、计算机网络、操作系统和计算机组成原理,这几本书是最基础的知识了,总结的还是挺到位的,而且比较精简

    011
    领券