一、题目
二、解题思路
(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运行截图