【每日刷题】Day22
🥕个人主页:开敲🍉
🔥所属专栏:每日刷题🍍
🌼文章目录🌼
[1. 1669. 合并两个链表 - 力扣(LeetCode)](#1. 1669. 合并两个链表 - 力扣(LeetCode))
[2. 11. 盛最多水的容器 - 力扣(LeetCode)](#2. 11. 盛最多水的容器 - 力扣(LeetCode))
[3. 148. 排序链表 - 力扣(LeetCode)](#3. 148. 排序链表 - 力扣(LeetCode))
1. 1669. 合并两个链表 - 力扣(LeetCode)
//思路:使用两个指针定位到需要删除的数据的两端,再使用两个指针free掉中间的数据,随后再将链表连接即可
typedef struct ListNode LN;
struct ListNode* mergeInBetween(struct ListNode* list1, int a, int b, struct ListNode* list2)
{
LN* sta = list1;
LN* des = list1;
while(--a)//定位到需要删除的第一个节点的前一个节点
{
sta = sta->next;
}
while(b+1)//定位到需要删除的最后一个节点的后一个节点
{
des = des->next;
b--;
}
LN* pmove = list2;
while(pmove->next)//定位到list2的末尾
{
pmove = pmove->next;
}
LN* pdel = sta->next;
while(pdel!=des)//删除节点
{
LN* pcur = pdel->next;
free(pdel);
pdel = pcur;
}
sta->next = list2;//连接链表
pmove->next = des;
return list1;
}
2. 11. 盛最多水的容器 - 力扣(LeetCode)
//思路:双指针。分别从数组头尾向中间遍历,每一次遍历较小值为高,算出面积,记录最大的面积返回。
int maxArea(int* height, int heightSize)
{
int ans = 0;
int left = 0;
int right = heightSize-1;
while(left<right)
{
int high = height[left]<height[right]?height[left]:height[right];//较小值为高
int area = (right-left)*high;//算出面积
ans = area>ans?area:ans;记录最大面积
height[left]<height[right]?left++:right--;//将较小的那一边向中间遍历一下
}
return ans;
}
3. 148. 排序链表 - 力扣(LeetCode)
//思路:使用数组将链表中的值存储,使用qsort库函数对数组排序,再将数组中的元素逐个放回链表中,完成链表排序
typedef struct ListNode LN;
int cmp(const void* a,const void* b)
{
return *(int*)a-*(int*)b;
}
struct ListNode* sortList(struct ListNode* head)
{
int arr[50001];
LN* pmove = head;
LN* newhead = head;
int i = 0;
while(pmove)//将链表中的值存储进数组
{
arr[i++] = pmove->val;
pmove = pmove->next;
}
qsort(arr,i,sizeof(int),cmp);//按照升序将数组排序
for(int j = 0;j<i;j++)//再将数组的元素逐个存储回链表
{
newhead->val = arr[j];
newhead = newhead->next;
}
return head;
}