C++实现算法题之合并有序链表

这篇博客主要介绍了如何合并两个已排序的链表。通过创建一个伪头节点,然后比较两个链表中节点的值,将较小的节点添加到结果链表中,直到其中一个链表为空。最后,将非空链表剩余的部分追加到结果链表的末尾,实现了合并有序链表的功能。在示例中,给定了两个链表1->2->4和1->3->4,合并后的链表为1->1->2->3->4->4。
摘要由CSDN通过智能技术生成

题目:将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的。

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

#include <iostream>

using namespace std;

struct myList
{
	int val;
	myList* next;
	myList(int _val):val(_val),next(nullptr){}
};

myList* merge(myList* l1, myList* l2)
{
	// 当l1或l2为空时跳出
	if (l1 == nullptr)
		return l2;
	if (l2 == nullptr)
		return l1;

	// 初始化伪头节点head(0)
	myList head(0);
	myList* node = &head;

	// l1为空或l2为空,跳出循环
	while (l1 != nullptr && l2 != nullptr)
	{
		// 当l1.val<l2.val时,节点node的后继节点指定为l1,并l1向前走一步
		if (l1->val < l2->val)
		{
			node->next = l1;
			l1 = l1->next;
		}
		else // 当l1.val>=l2.val时,节点node的后继节点指定为l2,并l2向前走一步
		{
			node->next = l2;
			l2 = l2->next;
		}
		// 节点node向前走一步,即node=node->next
		node = node->next;
	}

	// 若l1!=null,将l1添加至节点node之后
	if (l1 != nullptr)
		node->next = l1;
	else  // 否则,将l2添加至节点node之后
		node->next = l2;

	// 合并链表在伪头节点head之后,返回head.next
	return head.next;
}

int main()
{
	// 创建节点
	myList* node0 = new myList(1);
	myList* node1 = new myList(2);
	myList* node2 = new myList(4);

	myList* node3 = new myList(1);
	myList* node4 = new myList(3);
	myList* node5 = new myList(4);

	// 链表l1
	node0->next = node1;
	node1->next = node2;
	node2->next = nullptr;

	// 链表l2
	node3->next = node4;
	node4->next = node5;
	node5->next = nullptr;

	// 合并有序链表
	auto node = merge(node0, node3);

	// 打印排序后的链表
	while (node != nullptr)
	{
		cout << node->val << endl;
		node = node->next;
	}

	return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员之光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值