📌  相关文章
📜  用于就地合并两个链接列表而不更改第一个列表的链接的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:40:53.866000             🧑  作者: Mango

用于就地合并两个链接列表而不更改第一个列表的链接的 C++ 程序

在编写 C++ 程序时,我们时常需要将两个链接列表进行合并,但是在实际应用中,通常不希望更改第一个列表的链接,因此需要采用就地合并的方法。本篇文章介绍如何编写一个 C++ 程序,用于实现这一过程。

程序设计思路

我们可以采用递归的方式,遍历第一个列表,将第二个列表中的元素一个一个插入到第一个列表的合适位置。具体流程如下:

  1. 定义两个指针,一个指向第一个链表的头结点,一个指向第二个链表的头结点;
  2. 遍历第一个链表,比较第二个链表的头结点和当前节点,确定位置并插入;
  3. 递归处理下一个节点,直到第一个链表的所有节点都被遍历完成。
代码实现
struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    ListNode* mergeListNode(ListNode* l1, ListNode* l2) {
        if (!l1) return l2;
        if (!l2) return l1;

        if (l1->val > l2->val) {
            ListNode* temp = l2->next;
            l2->next = l1;
            l1 = l2;
            l2 = temp;
        }

        l1->next = mergeListNode(l1->next, l2);
        return l1;
    }
};
代码解释
  • mergeListNode 函数用于合并两个链表。
  • 如果第一个链表为空,则直接返回第二个链表。
  • 如果第二个链表为空,则直接返回第一个链表。
  • 如果第二个链表的头结点小于等于第一个链表的头结点,则将第二个链表的头结点插入到第一个链表的头部,并处理剩余部分。
  • 如果第二个链表的头结点大于第一个链表的头结点,则将第一个链表的头结点与剩余部分合并,继续递归处理。
总结

本篇文章介绍了如何编写一个 C++ 程序,用于就地合并两个链接列表而不更改第一个列表的链接。通过采用递归的思想,我们可以快速、高效地实现这一目标。