I 理解题目需求
1.合并两个已经是升序排列的链表
2.将它们合并为一个新的、也是升序排列的链表。
3.合并后的链表需要包含两个输入链表中的所有节点。
4.节点值需要保持升序排列。
5.使用题目模板
II 设计程序(参考:Violent-Ayang)
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
struct ListNode head;
head.next = list1;
struct ListNode* q = &head;
while(list1&&list2){
if(list1->val<list2->val){
q->next = list1;
list1 = list1->next;
}else{
q->next = list2;
list2 = list2->next;
}
q = q->next;
}
q->next = list1==NULL?list2:list1;
return head.next;
}
III 程序解析
函数mergeTwoLists
接收两个链表list1
和list2
作为输入,返回一个新的链表,该链表是list1
和list2
合并后的结果。
函数内部首先定义了一个虚拟头节点head
,并将其下一个节点指向list1
。然后,定义了一个指针q
,初始时指向head
。
接下来,使用一个while
循环来遍历list1
和list2
。在循环中,比较list1
和list2
的当前节点的值,将较小的节点连接到q
的下一个节点,并将对应的链表指针向前移动一位。同时,将q
指向当前合并后的链表的最后一个节点。
当list1
或list2
中的一个链表遍历完毕后,将另一个链表的剩余部分连接到q
的下一个节点。最后,返回虚拟头节点的下一个节点,即合并后的链表的头节点。
这个函数的时间复杂度为O(m + n),其中m和n分别是两个链表的长度。空间复杂度为O(1),因为除了输入链表之外,函数只使用了固定数量的额外空间。
IV 程序相关知识点
这个函数使用了C语言中的结构体(struct
)、指针(*
)、循环(while
)和条件语句(if
和else
)这四个C语言的基本知识点
1.结构体(struct):
结构体是一种复合数据类型,用于将多个不同数据类型的数据组合在一起。结构体中的每个元素可以定义为任意数据类型,包括整数、浮点数、字符、布尔值等。结构体可以用来表示复杂的数据结构,例如一个学生信息,可以包含学号、姓名、年龄等信息。
结构体定义的基本语法如下:
struct 结构体名 {
数据类型1 变量名1;
数据类型2 变量名2;
...
};
例如,我们定义一个表示学生的结构体:
struct Student {
char name[100];
int age;
float score;
};
在这个例子中,我们定义了一个名为Student
的结构体,其中包含三个成员变量:name
(字符数组,用于存储学生姓名)、age
(整数,用于存储学生年龄)和score
(浮点数,用于存储学生成绩)。
结构体可以作为函数的参数,也可以作为函数的返回值。例如,我们可以定义一个函数printStudent
,用于打印学生信息:
void printStudent(struct Student s) {
printf("Name: %s\n", s.name);
printf("Age: %d\n", s.age);
printf("Score: %.2f\n", s.score);
}
在这个例子中,printStudent
函数接受一个Student
结构体类型的参数s
,并打印其成员变量的值。
2.指针(*):
指针是C语言中一种特殊的变量,它可以指向一个变量、一个结构体或一个函数。使用指针可以实现对变量或函数的间接访问。指针的声明和定义的基本语法如下:
数据类型 *指针名;
例如,我们定义一个指向整数的指针p
:
int *p;
在这个例子中,我们定义了一个名为p
的指针,它指向一个整数类型变量。
指针可以用于访问和操作指向的变量。例如,我们可以使用指针p
来访问和修改其指向的整数a
的值:
int a = 10;
p = &a; // 将指针p指向变量a的内存地址
*p = 20; // 通过指针p访问和修改a的值
在这个例子中,我们首先定义了一个整数变量a
,然后使用&
运算符获取a
的内存地址,并将结果赋值给指针p
。然后,我们通过*p
操作符访问和修改指针p
指向的整数a
的值。
3.循环(while)和条件语句(if和else):
循环(while
)和条件语句(if
和else
)是C语言中的基本控制结构,用于控制程序的执行流程。
while
循环:
while
循环用于在给定条件为真时重复执行一段代码。基本语法如下:
while (条件表达式) {
代码块;
}
例如,我们使用while
循环计算1到10的整数和:
int i, sum = 0;
i = 1;
while (i <= 10) {
sum += i;
i++;
}
在这个例子中,我们定义了一个整数变量i
和一个变量sum
,初始时i
为1,sum
为0。然后,我们使用while
循环,当i
小于等于10时,将i
的值加到sum
上,并将i
加1。循环结束后,sum
的值就是1到10的整数和。
if
和else
语句:
if
和else
语句用于根据特定条件执行不同的代码块。基本语法如下:
if (条件表达式) {
代码块;
} else {
代码块;
标签:力扣,21,list1,struct,list2,链表,while,指针
From: https://blog.csdn.net/qq_47327611/article/details/140145122