15278363968 发表于 2023-7-9 19:08:59

设计两个有序单链表的合并排序算法。

设计两个有序单链表的合并排序算法。

陶远航 发表于 2023-7-9 19:09:11

要设计两个有序单链表的合并排序算法,可以采用迭代的方法来实现。下面是一个示例算法:

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

def mergeTwoLists(l1, l2):
    dummy = ListNode(0)
    current = dummy

    while l1 and l2:
      if l1.val < l2.val:
            current.next = l1
            l1 = l1.next
      else:
            current.next = l2
            l2 = l2.next
      current = current.next

    if l1:
      current.next = l1
    if l2:
      current.next = l2

    return dummy.next


在这个算法中,我们使用了一个虚拟节点 dummy 和一个当前指针 current 来构建新的有序链表。然后我们依次比较两个链表的节点值,将较小的节点添加到新链表中,并将指针向后移动。

最后,如果其中一个链表遍历完了,我们将另一个链表剩余的部分直接添加到新链表的末尾。

您可以调用这个函数来合并两个有序单链表,如下所示:

# 创建链表1
l1 = ListNode(1)
l1.next = ListNode(3)
l1.next.next = ListNode(5)

# 创建链表2
l2 = ListNode(2)
l2.next = ListNode(4)
l2.next.next = ListNode(6)

# 合并排序
merged = mergeTwoLists(l1, l2)

# 打印合并后的链表
while merged:
    print(merged.val)
    merged = merged.next


这将输出合并后的有序链表的节点值。

希望对您有帮助!如果您有更多问题,请随时提问。

isdkz 发表于 2023-7-9 19:10:52

在C语言中,你可以通过合并两个有序单链表来实现合并排序算法。这个过程实际上就是将两个已经排好序的链表合并成一个新的有序链表。以下是一个可能的实现:

首先,我们需要定义链表的节点结构:

struct Node {
    int data;
    struct Node* next;
};


然后,我们可以定义一个函数来创建新的节点:

struct Node* createNewNode(int data) {
    struct Node* newNode = (struct Node*) malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}


然后,我们需要实现链表的合并函数。这个函数需要接收两个有序链表作为参数,并返回一个合并后的新链表:

struct Node* mergeLists(struct Node* head1, struct Node* head2) {
    // 创建一个临时的头节点,用于帮助我们方便地合并两个链表
    struct Node* dummyHead = createNewNode(0);
    struct Node* current = dummyHead;

    while (head1 != NULL && head2 != NULL) {
      if (head1->data <= head2->data) {
            current->next = head1;
            head1 = head1->next;
      } else {
            current->next = head2;
            head2 = head2->next;
      }
      current = current->next;
    }

    // 如果链表1还有剩余节点,则将它们接在结果链表的末尾
    if (head1 != NULL) {
      current->next = head1;
    }

    // 如果链表2还有剩余节点,则将它们接在结果链表的末尾
    if (head2 != NULL) {
      current->next = head2;
    }

    // 返回结果链表,注意跳过我们添加的临时头节点
    return dummyHead->next;
}


在这个实现中,我们创建了一个临时的头节点,然后按照链表1和链表2的元素大小,逐个将元素添加到结果链表中。当其中一个链表的所有元素都被添加到结果链表后,我们还需要检查另一个链表是否还有剩余元素,如果有,则将它们也添加到结果链表中。最后,返回结果链表,注意要跳过我们添加的临时头节点。

这个实现的时间复杂度是 O(n),其中 n 是两个输入链表的节点总数。
页: [1]
查看完整版本: 设计两个有序单链表的合并排序算法。