剑指Offer----面试题17:合并两个排序的链表

本文介绍如何合并两个递增排序的链表,通过两种方法详细解析合并过程,确保新链表保持递增排序。方法一通过创建新链表逐节点比较合并,方法二提供改进思路。

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

题目:

输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然按照递增排序。如下图所示:



方法一:


分析:创建新的链表3,每次比较链表1和2上相应的值,再链表3上依次创建新的结点,并将各个结点连接起来。


源代码:

#include"List.h"
#include<iostream>

using std::cout;
using std::endl;

using namespace ListSpace5;

ListNode *MergeList(ListNode *list1, ListNode *list2)
{
	if (list1 == NULL && list2 == NULL)
	{
		cout << "两个链表都为空" << endl;
		return NULL;
	}
	else if (list1 == NULL && list2 != NULL)
		return list2;
	else if (list1 != NULL && list2 == NULL)
		return list1;
	else
	{//两个链表都不为空
		ListNode *newNode = NULL;
		ListNode *newNodeHead = NULL;//记录新链表的头结点
		int count = 0;
		ListNode *temp = NULL;//记录上一个结点,方便连接
		while (list1 != NULL && list2 != NULL)
		{
			
			if (list1->element > list2->element)
			{
				newNode = CreateListNode(list2->element);
				ListNode *mytemp = list2;
				list2 = list2->next;
				delete mytemp;//删除结点,防止内存泄漏
				mytemp = nullptr;
			}
			else
			{
				newNode = CreateListNode(list1->element);
				ListNode *mytemp = list1;//删除结点,防止内存泄漏
				list1 = list1->next;
				delete mytemp;
				mytemp = nullptr;
			}
			++count;
			if (count == 1)
			{
				newNodeHead = newNode;
				ConnectListNodes(newNode, NULL);
			}
			else
			{
				ConnectListNodes(temp, newNode);
				ConnectListNodes(newNode, NULL);
			}
			temp = newNode;
			newNode = newNode->next;
		}

		if (list1 == NULL)
			newNode = list2;
		if (list2 == NULL)
			newNode = list1;

		return newNodeHead;
	}
}

void test11()
{
	cout << "\t===========测试两个非空链表的合并===========" << endl;
	ListNode *list1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值