📜  门| GATE-CS-2000 |问题7(1)

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

GATE-CS-2000 Problem 7

问题描述

有两个单向链表L1和L2,两个列表中的节点已按升序排序。编写一个函数mergeLists(L1,L2)以将这两个列表合并为一个新的升序排列的单向链表,并返回对新列表头节点的引用。

函数原型应为:

def mergeLists(head1: ListNode, head2: ListNode) -> ListNode:
    pass

其中ListNode类如下所示:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
样例

以下是用于测试的两个链表和预期的输出。

list1: 1->3->5
list2: 2->4->6
merged list: 1->2->3->4->5->6
解题思路

这是一个经典问题,可以用归并排序的思想来解决。该算法的时间复杂度为$O(nlogn)$,其中n是两个链表的长度之和,空间复杂度为$O(1)$ 。

具体来说,我们可以用三个指针来维护链表,一个指向当前正在处理的节点,另外两个分别指向两个链表中的节点。每次比较两个链表的节点的值,将较小的节点链接到当前处理的节点,并将指针向后移动。当其中一个链表遍历完毕后,我们只需要将剩余的节点链接到当前处理的节点即可。

代码实现
def mergeLists(head1: ListNode, head2: ListNode) -> ListNode:
    dummy = ListNode(0)
    curr = dummy
    
    while head1 and head2:
        if head1.val < head2.val:
            curr.next = head1
            head1 = head1.next
        else:
            curr.next = head2
            head2 = head2.next
        curr = curr.next
        
    if head1:
        curr.next = head1
    if head2:
        curr.next = head2
    
    return dummy.next
总结

这个问题考察了链表的基本操作和归并排序的思想。熟练掌握链表的相关操作以及排序算法可以使程序员更高效地解决类似的问题。