鱼C论坛

 找回密码
 立即注册
查看: 1190|回复: 2

[已解决]设计两个有序单链表的合并排序算法。

[复制链接]
发表于 2023-7-9 19:08:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
设计两个有序单链表的合并排序算法。
最佳答案
2023-7-9 19:09:11
要设计两个有序单链表的合并排序算法,可以采用迭代的方法来实现。下面是一个示例算法:
  1. class ListNode:
  2.     def __init__(self, val=0, next=None):
  3.         self.val = val
  4.         self.next = next
  5. def mergeTwoLists(l1, l2):
  6.     dummy = ListNode(0)
  7.     current = dummy
  8.     while l1 and l2:
  9.         if l1.val < l2.val:
  10.             current.next = l1
  11.             l1 = l1.next
  12.         else:
  13.             current.next = l2
  14.             l2 = l2.next
  15.         current = current.next
  16.     if l1:
  17.         current.next = l1
  18.     if l2:
  19.         current.next = l2
  20.     return dummy.next
复制代码

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

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

您可以调用这个函数来合并两个有序单链表,如下所示:
  1. # 创建链表1
  2. l1 = ListNode(1)
  3. l1.next = ListNode(3)
  4. l1.next.next = ListNode(5)
  5. # 创建链表2
  6. l2 = ListNode(2)
  7. l2.next = ListNode(4)
  8. l2.next.next = ListNode(6)
  9. # 合并排序
  10. merged = mergeTwoLists(l1, l2)
  11. # 打印合并后的链表
  12. while merged:
  13.     print(merged.val)
  14.     merged = merged.next
复制代码

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

希望对您有帮助!如果您有更多问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-9 19:09:11 | 显示全部楼层    本楼为最佳答案   
要设计两个有序单链表的合并排序算法,可以采用迭代的方法来实现。下面是一个示例算法:
  1. class ListNode:
  2.     def __init__(self, val=0, next=None):
  3.         self.val = val
  4.         self.next = next
  5. def mergeTwoLists(l1, l2):
  6.     dummy = ListNode(0)
  7.     current = dummy
  8.     while l1 and l2:
  9.         if l1.val < l2.val:
  10.             current.next = l1
  11.             l1 = l1.next
  12.         else:
  13.             current.next = l2
  14.             l2 = l2.next
  15.         current = current.next
  16.     if l1:
  17.         current.next = l1
  18.     if l2:
  19.         current.next = l2
  20.     return dummy.next
复制代码

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

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

您可以调用这个函数来合并两个有序单链表,如下所示:
  1. # 创建链表1
  2. l1 = ListNode(1)
  3. l1.next = ListNode(3)
  4. l1.next.next = ListNode(5)
  5. # 创建链表2
  6. l2 = ListNode(2)
  7. l2.next = ListNode(4)
  8. l2.next.next = ListNode(6)
  9. # 合并排序
  10. merged = mergeTwoLists(l1, l2)
  11. # 打印合并后的链表
  12. while merged:
  13.     print(merged.val)
  14.     merged = merged.next
复制代码

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

希望对您有帮助!如果您有更多问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-9 19:10:52 | 显示全部楼层
在C语言中,你可以通过合并两个有序单链表来实现合并排序算法。这个过程实际上就是将两个已经排好序的链表合并成一个新的有序链表。以下是一个可能的实现:

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

  1. struct Node {
  2.     int data;
  3.     struct Node* next;
  4. };
复制代码


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

  1. struct Node* createNewNode(int data) {
  2.     struct Node* newNode = (struct Node*) malloc(sizeof(struct Node));
  3.     newNode->data = data;
  4.     newNode->next = NULL;
  5.     return newNode;
  6. }
复制代码


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

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

  5.     while (head1 != NULL && head2 != NULL) {
  6.         if (head1->data <= head2->data) {
  7.             current->next = head1;
  8.             head1 = head1->next;
  9.         } else {
  10.             current->next = head2;
  11.             head2 = head2->next;
  12.         }
  13.         current = current->next;
  14.     }

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

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

  23.     // 返回结果链表,注意跳过我们添加的临时头节点
  24.     return dummyHead->next;
  25. }
复制代码


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

这个实现的时间复杂度是 O(n),其中 n 是两个输入链表的节点总数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 03:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表