鱼C论坛

 找回密码
 立即注册
查看: 652|回复: 1

1.有两个有序链表A和B,A中存放的是1,3,5,7,9。B中存放的是2,4,6,8,10. 要求将两个...

[复制链接]
发表于 2024-9-30 14:52:57 | 显示全部楼层 |阅读模式

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

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

x
1.有两个有序链表A和B,A中存放的是1,3,5,7,9。B中存放的是2,4,6,8,10.
要求将两个有序链表合成一个有序链表1,2,3,4,5,6,7,8,9,10,用c语言写代码实现。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-9-30 14:53:12 | 显示全部楼层
可以使用归并的思想来合并两个有序链表。以下是C语言实现:

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. // 定义链表节点结构体
  4. struct ListNode {
  5.     int val;
  6.     struct ListNode* next;
  7. };

  8. // 创建新节点
  9. struct ListNode* createNode(int val) {
  10.     struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
  11.     newNode->val = val;
  12.     newNode->next = NULL;
  13.     return newNode;
  14. }

  15. // 合并两个有序链表
  16. struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
  17.     if (l1 == NULL) return l2;
  18.     if (l2 == NULL) return l1;

  19.     struct ListNode dummy; // 临时节点,便于拼接链表
  20.     struct ListNode* tail = &dummy; // 合并后的链表尾指针

  21.     // 合并操作
  22.     while (l1 != NULL && l2 != NULL) {
  23.         if (l1->val < l2->val) {
  24.             tail->next = l1;
  25.             l1 = l1->next;
  26.         } else {
  27.             tail->next = l2;
  28.             l2 = l2->next;
  29.         }
  30.         tail = tail->next;
  31.     }

  32.     // 连接剩余部分
  33.     tail->next = (l1 != NULL) ? l1 : l2;

  34.     return dummy.next;
  35. }

  36. // 打印链表
  37. void printList(struct ListNode* head) {
  38.     while (head != NULL) {
  39.         printf("%d ", head->val);
  40.         head = head->next;
  41.     }
  42.     printf("\n");
  43. }

  44. int main() {
  45.     // 创建链表A: 1 -> 3 -> 5 -> 7 -> 9
  46.     struct ListNode* A = createNode(1);
  47.     A->next = createNode(3);
  48.     A->next->next = createNode(5);
  49.     A->next->next->next = createNode(7);
  50.     A->next->next->next->next = createNode(9);

  51.     // 创建链表B: 2 -> 4 -> 6 -> 8 -> 10
  52.     struct ListNode* B = createNode(2);
  53.     B->next = createNode(4);
  54.     B->next->next = createNode(6);
  55.     B->next->next->next = createNode(8);
  56.     B->next->next->next->next = createNode(10);

  57.     // 合并链表
  58.     struct ListNode* mergedList = mergeTwoLists(A, B);

  59.     // 打印合并后的链表
  60.     printList(mergedList);

  61.     // 释放内存
  62.     while (mergedList != NULL) {
  63.         struct ListNode* temp = mergedList;
  64.         mergedList = mergedList->next;
  65.         free(temp);
  66.     }

  67.     return 0;
  68. }
复制代码


这个代码首先定义了链表节点的结构体,并提供了创建新节点和打印链表的函数。合并两个有序链表的核心函数是 `mergeTwoLists`,使用归并的思想遍历两个链表并合并成一个新的有序链表。最后,在主函数中演示了如何创建两个示例链表并进行合并和打印。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-8 00:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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