📅  最后修改于: 2023-12-03 14:58:24.533000             🧑  作者: Mango
有两个单向链表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
这个问题考察了链表的基本操作和归并排序的思想。熟练掌握链表的相关操作以及排序算法可以使程序员更高效地解决类似的问题。