返回

链表合并:征服 LeetCode 高频面试题

见解分享

前言

链表是一种广泛应用于数据结构和算法中的线性数据结构,在各种编程语言中都扮演着重要的角色。在 LeetCode 上,链表相关的问题经常出现在面试中,其中合并有序链表尤为常见。

算法解析

合并有序链表的目的是将两个或多个已经排序的链表合并成一个新的有序链表。算法的核心思想是逐个比较两条链表当前结点的值,将较小的结点连接到合并后的链表,然后移动指向较小结点的指针。重复此过程,直到遍历完所有结点。

算法步骤

  1. 创建一个新链表,称为 head,作为合并后的链表的头部。
  2. 创建两个指针,p1p2,分别指向两个待合并链表的头部。
  3. p1p2 均不为 null 时,执行以下步骤:
    • 比较 p1p2 指向的结点的值。
    • 将较小值的结点连接到 head 链表的尾部。
    • 将指向较小值结点的指针(p1p2)移动到下一个结点。
  4. 当其中一条链表遍历完时,将另一条链表的剩余部分连接到合并后的链表尾部。

代码实现

以下是合并有序链表的 C++ 代码实现:

ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
    ListNode* head = new ListNode(0);
    ListNode* p1 = l1;
    ListNode* p2 = l2;
    ListNode* pre = head;
    
    while (p1 && p2) {
        if (p1->val < p2->val) {
            pre->next = p1;
            p1 = p1->next;
        } else {
            pre->next = p2;
            p2 = p2->next;
        }
        pre = pre->next;
    }
    
    if (p1) {
        pre->next = p1;
    }
    if (p2) {
        pre->next = p2;
    }
    
    return head->next;
}

拓展应用

合并有序链表的算法在实际场景中有着广泛的应用,例如:

  • 合并多个用户输入的数据流以获得一个按顺序排列的总数据集。
  • 将文件中的多个有序记录合并到一个文件中。
  • 在数据分析中,合并来自不同来源的数据以获得更全面和准确的见解。

结语

理解和掌握链表合并算法是 LeetCode 面试中的一项必备技能。通过深入了解算法原理和代码实现,你可以提升自己的技术能力,在面试中脱颖而出。