单链表-合并两个递增有序链表

本文介绍如何将两个递增有序的单链表合并成一个新的递增有序链表。通过详细的步骤解析,阐述了这一数据结构操作的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

合并两个递增有序链表

将两个递增的有序链表合并为一个递增的有序链表

LNode *Merge(LNode *L1,LNode *L2){
	if(L1==0||L2==0) return 0;//若两表为空则返回空
	if(L1->next==0) return L2; //表1为空直接返回表二
	LNode *p=L1->next,*q=L2->next,*r=L1;
	L1->next=0;
	L2->next=0;
	while(p&&q){
		if(p->data<q->data){//p的值小于q的值
			r->next=p;
			r=p;
			p=p->next;
		}
		else {
			r->next=q;
			r=q;
			q=q->next;
		}
	}
	if(p) r->next=p;//处理剩余结点
	if(q) r->next=q;
	free(L2);
	return L1;
}
当你有两个已排序的单链表,你需要将它们合并成一个新的有序链表。这个过程可以通过遍历两个链表,每次选择当前链表中的较小元素来构建新的链表。以下是一个简单的C++实现: ```cpp #include <iostream> struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if (!l1) return l2; // 如果l1为空,直接返回l2 if (!l2) return l1; // 如果l2为空,直接返回l1 // 创建一个新的头节点,初始指向l1 ListNode* head = l1; if (l1->val > l2->val) { // 检查l1的第一个元素是否大于l2的第一个元素 head = l2; // 将指针移动到l2 } // 遍历两个链表,直到有一个链表遍历完 while (l1 && l2) { if (l1->val <= l2->val) { // 如果l1的值小于等于l2,将其添加到新链表 l1 = l1->next; } else { // 否则,将l2的值添加到新链表 l2 = l2->next; } } // 将剩余未遍历完的链表添加到新链表末尾 head->next = l1 ? l1 : l2; return head; } // 测试示例 int main() { ListNode* list1 = new ListNode(1); list1->next = new ListNode(2); list1->next->next = new ListNode(4); ListNode* list2 = new ListNode(1); list2->next = new ListNode(3); list2->next->next = new ListNode(4); ListNode* result = mergeTwoLists(list1, list2); // 打印结果 while (result) { std::cout << result->val << " "; result = result->next; } std::cout << "\n"; return 0; } ``` 在这个例子中,`mergeTwoLists` 函数接受两个已排序的链表 `l1` 和 `l2` 的头结点,然后按照升序顺序合并它们。如果某个链表已经遍历完,那么就直接将另一个链表剩余的部分添加到新链表
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值