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

一、题目
在这里插入图片描述
在这里插入图片描述
二、解题思路
(1)思路一
我们可以先分情况讨论:
1、链表一为空,直接返回链表二。

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

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

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

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

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

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

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

三、测试代码

#include <stdio.h>
#include <stdlib.h>
#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 : %o\n",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运行截图
在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值