📜  门| GATE-CS-2007 |问题13(1)

📅  最后修改于: 2023-12-03 14:58:28.009000             🧑  作者: Mango

问题13

本题考察对数据结构的理解和编程实现能力。

题目描述

给定两个升序排列的有序链表L1L2,请设计一个非递归算法将它们合并为一个有序链表L。可以用常数空间。要求算法时间复杂度为$O(max(len(L1), len(L2)))$。

输入格式

链表L1L2

输出格式

合并后的有序链表L

输入样例

链表L1

1 → 3 → 5

链表L2

2 → 4 → 6 → 8
输出样例

合并后的有序链表L

1 → 2 → 3 → 4 → 5 → 6 → 8
算法分析

该算法可以使用双指针法,分别指向L1L2的头节点,比较两节点值大小,将小值节点接到合并后的链表L尾部。

算法流程:

  • 初始化双指针p1p2分别指向L1L2的头节点;
  • 初始化链表L和指针p3,链表L的头节点为空,指针p3指向链表L的头节点;
  • 比较p1p2节点的值大小,将较小值节点接到链表L的尾部;
  • 如果p1节点为空,将p2节点以及p2节点之后的所有节点接到链表L的尾部;
  • 如果p2节点为空,将p1节点以及p1节点之后的所有节点接到链表L的尾部;
  • 返回合并后的链表L
代码实现

以下为Python实现代码:

class Node:
    def __init__(self, val=None, next=None):
        self.val = val
        self.next = next

def merge_sorted_lists(l1: Node, l2: Node) -> Node:
    dummy = Node()
    p1, p2, p3 = l1, l2, dummy
    while p1 and p2:
        if p1.val < p2.val:
            p3.next = p1
            p1 = p1.next
        else:
            p3.next = p2
            p2 = p2.next
        p3 = p3.next
    p3.next = p1 if p1 else p2
    return dummy.next
总结

该算法利用常数空间实现了两个有序链表的合并操作,并且时间复杂度为$O(max(len(L1), len(L2)))$。此外,该算法还可以用递归实现。对于大数据量的情况,建议使用迭代实现。