栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

leecode-C语言实现-21. 合并两个有序链表

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leecode-C语言实现-21. 合并两个有序链表

一、题目


二、解题思路
(1)思路一
我们可以先分情况讨论:
1、链表一为空,直接返回链表二。

2、链表二为空,直接返回链表一。

3、链表一为空,链表二也为空,第一层逻辑里面已经做了判断,不予处理。

4、链表一、链表二都不为空。

就第四种情况展开讨论,我们可以先把要实现的功能进行拆分逐步实现,一个是创建一个头链表,另一个是往链表插入数据,这一块的实现可以参考我之前写的一遍博客《C语言学习-13-链表-练习01-删除、插入、释放动态链表》,然后就是同时遍历两个链表,我们再分情况来讨论:
1、链表一的值等于链表二的值
这两个值加入到新链表中,并使链表一和链表二指向下个节点。

2、链表一的值大于链表二的值
链表二的值加入到新链表中,并使链表二指向下个节点。

3、链表一的值小于链表二的值
链表一的值加入到新链表中,并使链表一指向下个节点。

链表一和链表二的长度不一定相等,还会出现链表一已经遍历完,链表二还有值需要遍历,或者反之,这时我们只需要把链表一和链表二都遍历一遍即可,这两段代码只会执行其中一种情况,最后便可以拿到合并好的链表。

三、测试代码

#include 
#include 
#define INITNUM (-101)

struct ListNode {
	int val;
	struct ListNode* next;
};

void main() {
	struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2);
	void PrintfList(struct ListNode* head);
	void DropList(struct ListNode* head);
	struct ListNode* CreateHeadList(int num);
	void InsertListData(struct ListNode* head, int num);

	struct ListNode* test_list1 = CreateHeadList(INITNUM);
	struct ListNode* test_list2 = CreateHeadList(INITNUM);
	int arr1[] = { 1,3,5 };
	int arr2[] = { 1,2,6 };
	int arr_size1 = sizeof(arr1) / sizeof(int);
	int arr_size2 = sizeof(arr2) / sizeof(int);
	int i;
	for ( i = 0; i < arr_size1; i++)
	{
		InsertListData(test_list1, arr1[i]);
	}
	for (i = 0; i < arr_size2; i++)
	{
		InsertListData(test_list2, arr2[i]);
	}
	PrintfList(test_list1);
	PrintfList(test_list2);

	struct ListNode* res = mergeTwoLists(test_list1, test_list2);
	PrintfList(res);

	DropList(res);
}

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
	if (list1 == NULL)
	{
		return list2;
	}
	else if (list2 == NULL)
	{
		return list1;
	}

	struct ListNode* CreateHeadList(int num);
	void InsertListData(struct ListNode* head, int num);

	struct ListNode* head = CreateHeadList(INITNUM);
	struct ListNode* pl1 = list1;
	struct ListNode* pl2 = list2;

	while (pl1 != NULL && pl2 != NULL) 
	{
		if (pl1->val == pl2->val)
		{
			InsertListData(head, pl1->val);
			InsertListData(head, pl2->val);
			pl1 = pl1->next;
			pl2 = pl2->next;
		}
		else if (pl1->val > pl2->val)
		{
			InsertListData(head, pl2->val);
			pl2 = pl2->next;
		}
		else if (pl1->val < pl2->val)
		{
			InsertListData(head, pl1->val);
			pl1 = pl1->next;
		}
	}

	while (pl1 != NULL)
	{
		InsertListData(head, pl1->val);
		pl1 = pl1->next;
	}

	while (pl2 != NULL)
	{
		InsertListData(head, pl2->val);
		pl2 = pl2->next;
	}

	return head;
}

struct ListNode* CreateHeadList(int num) {
	struct ListNode* head = malloc(sizeof(struct ListNode));
	head->val = num;
	head->next = NULL;
	return head;
};

void InsertListData(struct ListNode* head, int num) {
	struct ListNode* p = head;
	while (p->next != NULL)
	{
		p = p->next;
	}
	if (p->val == INITNUM)
	{
		p->val = num;
	}
	else
	{
		struct ListNode* q = malloc(sizeof(struct ListNode));
		q->val = num;
		q->next = NULL;
		p->next = q;
	}

}

void PrintfList(struct ListNode* head) {
	struct ListNode* p = head;
	while (p != NULL) {
		printf("cur_p : %o, val : %d, next : %on",p,p->val,p->next);
		p = p->next;
	}
	printf("+++++++++++++++++++++n");
}

void DropList(struct ListNode* head) {
	struct ListNode* p = head;
	struct ListNode* q;
	while (p != NULL) {
		q = p->next;
		free(p);
		p = q;
	}
}

四、代码测试截图
(1)linux

(2)window

五、leecode提交代码

#define INITNUM (-101)

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
	if (list1 == NULL)
	{
		return list2;
	}
	else if (list2 == NULL)
	{
		return list1;
	}

	struct ListNode* CreateHeadList(int num);
	void InsertListData(struct ListNode* head, int num);

	struct ListNode* head = CreateHeadList(INITNUM);
	struct ListNode* pl1 = list1;
	struct ListNode* pl2 = list2;

	while (pl1 != NULL && pl2 != NULL) 
	{
		if (pl1->val == pl2->val)
		{
			InsertListData(head, pl1->val);
			InsertListData(head, pl2->val);
			pl1 = pl1->next;
			pl2 = pl2->next;
		}
		else if (pl1->val > pl2->val)
		{
			InsertListData(head, pl2->val);
			pl2 = pl2->next;
		}
		else if (pl1->val < pl2->val)
		{
			InsertListData(head, pl1->val);
			pl1 = pl1->next;
		}
	}

	while (pl1 != NULL)
	{
		InsertListData(head, pl1->val);
		pl1 = pl1->next;
	}

	while (pl2 != NULL)
	{
		InsertListData(head, pl2->val);
		pl2 = pl2->next;
	}

	return head;
}

struct ListNode* CreateHeadList(int num) {
	struct ListNode* head = malloc(sizeof(struct ListNode));
	head->val = num;
	head->next = NULL;
	return head;
};

void InsertListData(struct ListNode* head, int num) {
	struct ListNode* p = head;
	while (p->next != NULL)
	{
		p = p->next;
	}
	if (p->val == INITNUM)
	{
		p->val = num;
	}
	else
	{
		struct ListNode* q = malloc(sizeof(struct ListNode));
		q->val = num;
		q->next = NULL;
		p->next = q;
	}
}

六、leecode运行截图

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/783891.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号