给定两个链表,每个链表都已经按升序排列,设计算法实现将两个链表合并到一个升序链表中,返回合并后的链表,用c语言写出这段代码并给出中文注释
时间: 2023-05-21 21:02:03 浏览: 118
c代码-将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
以下是CSDN开发的C知道的回答:
这是一个经典的链表合并问题,我们可以使用递归的方式来解决。
首先,我们定义一个新的链表头节点,然后比较两个链表的头节点值的大小,将较小的节点作为新链表的下一个节点,然后递归调用函数,直到其中一个链表为空,此时将另一个链表直接连接到新链表的尾部即可。
以下是C语言的代码实现:
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
if (l1 == NULL) return l2;
if (l2 == NULL) return l1;
if (l1->val < l2->val) {
l1->next = mergeTwoLists(l1->next, l2);
return l1;
} else {
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
其中,ListNode是链表节点的结构体,包含一个整型值val和一个指向下一个节点的指针next。
注释如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 合并两个升序链表
* @param l1 链表1
* @param l2 链表2
* @return 合并后的链表
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
// 如果链表1为空,返回链表2
if (l1 == NULL) return l2;
// 如果链表2为空,返回链表1
if (l2 == NULL) return l1;
// 比较两个链表的头节点值的大小
if (l1->val < l2->val) {
// 将较小的节点作为新链表的下一个节点
l1->next = mergeTwoLists(l1->next, l2);
return l1;
} else {
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
阅读全文