📌  相关文章
📜  合并两个未排序的链表得到一个排序的链表(1)

📅  最后修改于: 2023-12-03 15:37:09.962000             🧑  作者: Mango

合并两个未排序的链表得到一个排序的链表

在进行链表操作时,经常需要将两个未排序的链表合并为一个新的排序好的链表。本文将介绍如何通过编写代码实现此功能。

算法思想

实现该功能需要用到归并排序中的合并操作。具体思路如下:

  1. 定义一个新的链表,并设置一个指针指向它,作为结果链表。
  2. 定义两个指针分别指向两个未排序的链表的头结点。
  3. 通过比较两个链表中指针所指节点的大小,将较小值的节点放入结果链表中,并将该链表的指针向后移动一位。
  4. 重复上述操作,直到两个链表中的一个为空。
  5. 将剩余的非空链表添加到结果链表之后。
代码实现
def mergeTwoLists(l1, l2):
    """
    :type l1: ListNode
    :type l2: ListNode
    :rtype: ListNode
    """
    new_list = ListNode(0)  # 定义一个新的链表并将指针指向它
    ptr = new_list
    while l1 and l2:  # 比较两个链表中节点的大小并将较小值放入结果链表中
        if l1.val > l2.val:
            ptr.next = l2
            l2 = l2.next
        else:
            ptr.next = l1
            l1 = l1.next
        ptr = ptr.next
    ptr.next = l1 or l2  # 将剩余的非空链表添加到结果链表之后
    return new_list.next  # 返回结果链表
时间复杂度与空间复杂度

在该算法中,需要遍历两个未排序的链表。因此,时间复杂度为 $O(n)$。由于需要新创建一个链表,因此空间复杂度为 $O(n)$。