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



