Problem: 21. 合并两个有序链表
思路
链表是非递减的,因此每次只需对比两个结点的值即可。(具体操作看代码理解!)
解题方法
直接看代码注释解释,代码+注释更好理解!
复杂度
- 时间复杂度:
时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度:
空间复杂度: O ( 1 ) O(1) O(1)
Code
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
// 当任意链表为空时,返回另一个链表
if(list1 == NULL){
return list2;
}else if(list2 == NULL){
return list1;
}
// 两个链表不为空则时
// 创建一个哨兵结点:便于直接返回
struct ListNode* plist = (struct ListNode*)malloc(sizeof(struct ListNode));
// 再创建一个游标结点,用于链接找到的结点
struct ListNode* p = plist;
// 任意不为空时执行寻找较小值
while(list1!=NULL&&list2!=NULL){
if(list1->val < list2->val){
p->next = list1;
list1 = list1->next;
}else{
p->next = list2;
list2 = list2->next;
}
// 此处注意不要漏
p = p->next;
}
// 跳出循环则说明其中一个链表为空,此时再简单判断以下,让游标结点链接非空的链表即可
p->next = list1 == NULL?list2:list1;
return plist->next;
}