合并两个有序链表的算法

下面是使用JavaScript语法实现的合并两个有序链表的算法,以及一个可能的应用场景。

JavaScript实现

首先,我们定义链表节点的构造函数:

function ListNode(val, next) {
    this.val = (val === undefined ? 0 : val);
    this.next = (next === undefined ? null : next);
}

然后,我们实现合并两个有序链表的函数:

function mergeTwoLists(l1, l2) {
    // 创建一个哨兵节点
    let prehead = new ListNode(-1);
    
    // 维护一个指针用于构建新链表
    let prev = prehead;
 
    // 当两个链表都不为空时,进行比较并构建新链表
    while (l1 !== null && l2 !== null) {
        if (l1.val <= l2.val) {
            prev.next = l1;
            l1 = l1.next;
        } else {
            prev.next = l2;
            l2 = l2.next;
        }
        prev = prev.next;
    }
 
    // 连接剩余的链表部分
    prev.next = l1 !== null ? l1 : l2;
 
    // 返回合并后的链表的头节点(跳过哨兵节点)
    return prehead.next;
}
应用场景

合并两个有序链表在很多场景中都非常有用,特别是在处理有序数据时。以下是一个可能的应用场景:

场景描述:

假设你有两个数据源,每个数据源都提供了一个有序的用户列表,这些用户列表是根据用户的注册时间排序的。现在,你需要将这两个列表合并成一个新的有序用户列表,以便进一步处理(比如发送邮件通知、生成报告等)。

具体实现:
  1. 数据准备:
    • 从两个数据源分别获取有序的用户列表,并将它们转换为链表形式(每个节点包含用户的ID或其他相关信息)。
  2. 并链表:
    • 使用mergeTwoLists函数将这两个有序链表合并成一个新的有序链表。
      处理合并后的链表:
    • 遍历合并后的链表,对每个用户执行所需的操作(如发送欢迎邮件、更新用户状态等)。
示例代码(应用场景)
// 假设我们有两个有序的用户ID列表
const list1 = createLinkedList([1, 3, 5]);
const list2 = createLinkedList([2, 4, 6]);
 
// 合并这两个有序链表
const mergedList = mergeTwoLists(list1, list2);
 
// 遍历合并后的链表并处理每个用户(这里只是简单地打印出来)
let currentNode = mergedList;
while (currentNode !== null) {
    console.log('User ID:', currentNode.val);
    currentNode = currentNode.next;
}
 
// 辅助函数,用于创建链表
function createLinkedList(arr) {
    if (arr.length === 0) return null;
    let head = new ListNode(arr[0]);
    let current = head;
    for (let i = 1; i < arr.length; i++) {
        current.next = new ListNode(arr[i]);
        current = current.next;
    }
    return head;
}

在这个示例中,我们首先使用createLinkedList辅助函数创建了两个有序链表list1和list2,然后使用mergeTwoLists函数将它们合并成一个新的有序链表mergedList。最后,我们遍历mergedList并打印出每个用户的ID。这个场景展示了如何在实际应用中合并两个有序链表并处理合并后的结果。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容