LeetCode 21. 合并两个有序链表 | C语言版
- LeetCode 21. 合并两个有序链表
- 题目描述
- 解题思路
- 思路一:使用栈
- 代码实现
- 运行结果
- 参考文章:
- 思路二:减少遍历节点数
- 代码实现
- 运行结果
- 参考文章:[]()
- LeetCode 剑指 Offer II 078. 合并排序链表
- 题目描述
- 解题思路
- 思路一:分治思想,归并排序
- 代码实现
- 运行结果
- 参考文章:[https://leetcode.cn/problems/vvXgSW/solutions/944453/cpython3java-1bian-li-zhu-ge-he-bing-2-b-xngx/?orderBy=most_votes&languageTags=cpp%2Cc](https://leetcode.cn/problems/vvXgSW/solutions/944453/cpython3java-1bian-li-zhu-ge-he-bing-2-b-xngx/?orderBy=most_votes&languageTags=cpp,c)
- 思路二:减少遍历节点数
- 代码实现
- 运行结果
- 参考文章:[]()
LeetCode 21. 合并两个有序链表
题目描述
题目地址:21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的
解题思路
思路一:使用栈
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/*
C初始动态分配语句 L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);
每个数据元素所占用存储空间的大小 sizeof(ElemType)
*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
//list1为空
if(!list1) return list2;
//list2为空
if(!list2) return list1;
struct ListNode* head=(struct ListNode*)malloc(sizeof(struct ListNode)),*t=head;
while(list1 && list2){
if(list1->val<list2->val){
t->next=list1;
list1=list1->next;
}else{
t->next=list2;
list2=list2->next;
}
t=t->next;
}
//list2为空(遍历完毕)
if(list1) t->next=list1;
//list1为空(遍历完毕)
if(list2) t->next=list2;
return head->next;
}
运行结果
参考文章:
https://leetcode.cn/problems/merge-two-sorted-lists/solutions/126597/cliang-chong-fang-fa-chang-gui-di-gui-by-danny-50/?orderBy=most_votes&languageTags=c
思路二:减少遍历节点数
代码实现
在这里插入代码片
运行结果
参考文章:
LeetCode 剑指 Offer II 078. 合并排序链表
题目描述
题目地址:剑指 Offer II 078. 合并排序链表
给定一个链表数组,每个链表都已经按升序排列。
请将所有链表合并到一个升序链表中,返回合并后的链表。
解题思路
思路一:分治思想,归并排序
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/*
*利用归并排序的原理,采用分治思想:将k个已排序链表分成前k/2个已排序链表和后k/2个已排序链表,这两部分链表再继续递归地进行划分;递归到每组只剩一个链表时,再两两合并
*/
//治:将链表合并
struct ListNode* merge(struct ListNode* a, struct ListNode* b){
//虚拟头结点
struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));
//注意申请节点之后对结构体内的指针赋值,赋值为NULL总没问题
dummy->next=NULL;
//合并的新链表
struct ListNode* x = dummy;
//a=[1],[4],[5],[1] b=[3],[4],[2],[6]
while (a && b){
//将小的数字放入到合并的新链表中(实现排序)
if (a->val < b->val){
x->next = a;
a = a->next;
}else{
x->next = b;
b = b->next;
}
x = x->next;
}
//如果链表a中还有元素(链表b中元素为空),将a中元素全部放入新链表x
if (a) x->next = a;
//如果链表b中还有元素(链表a中元素为空),将b中元素全部放入新链表x
if (b) x->next = b;
//x=[1,1,2,3,4,4,5,6]
return dummy->next;
}
//分
struct ListNode* merge_sort(struct ListNode** lists, int l, int r){
if (l == r) return lists[l];
int mid = (l + r) / 2;
//递归分割链表,直至每个链表只有一个元素
struct ListNode* L = merge_sort(lists, l, mid);
struct ListNode* R = merge_sort(lists, mid + 1, r);
//l=[1],[4],[5],[1] r=[3],[4],[2],[6]
//将这些链表(只有一个元素)按照升序合并
return merge(L, R);
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize){
//lists =[[1,4,5],[1,3,4],[2,6]]
if (listsSize == 0) return NULL;
return merge_sort(lists, 0, listsSize - 1);
}
运行结果
参考文章:https://leetcode.cn/problems/vvXgSW/solutions/944453/cpython3java-1bian-li-zhu-ge-he-bing-2-b-xngx/?orderBy=most_votes&languageTags=cpp%2Cc
思路二:减少遍历节点数
代码实现
在这里插入代码片