将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例1:

输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = [] 输出:[]
示例 3:
输入:l1 = [], l2 = [0] 输出:[0]
提示:
- 两个链表的节点数目范围是
[0, 50] -100 <= Node.val <= 100l1和l2均按 非递减顺序 排列
代码:
先定义链表数据结构,在头文件dataDefine.h
#ifndef _DATA_DEFINE_H
#define _DATA_DEFINE_H
namespace data_define {
// Definition for singly-linked list.
struct ListNode {
int val;
struct ListNode* next;
};
}
#endif
功能代码:
struct data_define::ListNode* mergeTwoLists(struct data_define::ListNode* list1, struct data_define::ListNode* list2) { // leecode 21. 合并两个有序链表
if (list1 == NULL)
return list2;
if (list2 == NULL)
return list1;
struct data_define::ListNode* list = NULL;
struct data_define::ListNode* last = NULL; // 记录链表尾部
for (;list1 != NULL || list2 != NULL;) {
if (list1 == NULL) {
last->next = list2;
//printf("list1 == NULL\n");
//printListNode(list);
break;
}
if (list2 == NULL) {
last->next = list1;
//printf("list2 == NULL\n");
//printListNode(list);
break;
}
//printf("list1: %p, ", list1);
//printf("list2: %p\n", list2);
// 调试
//printf("list1 val: %d, ", list1->val);
//printf("list2 val: %d\n", list2->val);
struct data_define::ListNode* next = NULL;
struct data_define::ListNode* minListNode = (list1->val < list2->val) ? list1 : list2;
if (minListNode == NULL) { // 不可能为空指针,但是不判空编译不过
break;
}
if (list == NULL) {
list = minListNode;
last = list;
}
else {
last->next = minListNode;
last = minListNode;
}
next = minListNode->next;
minListNode->next = NULL; // minListNode和它的下一个节点段开联系
if (list1->val < list2->val) {
list1 = next; // list1 变为它的下一个节点
}
else {
list2 = next;
}
//printf("list1 and list2 not null \n");
//printListNode(list);
}
return list;
}
测试代码:
void testleeCode21() {
struct data_define::ListNode node1;
struct data_define::ListNode node2;
struct data_define::ListNode node4;
node1.val = 1;
node2.val = 2;
node4.val = 4;
node1.next = &node2;
node2.next = &node4;
node4.next = NULL; // 非常重要,否则值是随机的
struct data_define::ListNode node1_;
struct data_define::ListNode node3_;
struct data_define::ListNode node4_;
node1_.val = 1;
node3_.val = 3;
node4_.val = 4;
node1_.next = &node3_;
node3_.next = &node4_;
node4_.next = NULL;
struct data_define::ListNode* newNode = mergeTwoLists(&node1, &node1_);
// 打印结果:
printListNode(newNode);
}
void printListNode(struct data_define::ListNode* node) {
printf("[");
int isFirst = 1;
for (;node != NULL;) {
if (!isFirst) {
printf(",");
}
else {
isFirst = 0;
}
printf("%d", node->val);
node = node->next;
}
printf("]\n");
}
打印调用结果如下:

ok,结果正确。
总结:链表ListNode如果没有下一个节点,必须显式的将其next节点置为空指针NULL,否则会被赋值为一个奇怪的值,然后调用过程中报错:引发了异常:读取访问权限冲突。


556

被折叠的 条评论
为什么被折叠?



