【每日刷题】Day15
🥕个人主页:开敲🍉
🔥所属专栏:每日刷题🍍
目录
[1. 141. 环形链表 - 力扣(LeetCode)](#1. 141. 环形链表 - 力扣(LeetCode))
[2. 142. 环形链表 II - 力扣(LeetCode)](#2. 142. 环形链表 II - 力扣(LeetCode))
[3. 143. 重排链表 - 力扣(LeetCode)](#3. 143. 重排链表 - 力扣(LeetCode))
1. 141. 环形链表 - 力扣(LeetCode)
//思路:快慢指针。pf1一次走两步,pf2一次走一步,如果是环形,pf1最终一定会追上pf2。如果不是环形,pf1最终会走出链表
typedef struct ListNode LN;
bool hasCycle(struct ListNode *head)
{
if(head==NULL||head->next==NULL)
{
return false;
}
LN* pf1 = head;
LN* pf2 = head;
while(pf1)
{
if(pf1->next==NULL)
{
return false;
}
pf1 = pf1->next->next;
if(pf1==pf2)
{
return true;
}
pf2 = pf2->next;
}
return false;
}
2. 142. 环形链表 II - 力扣(LeetCode)
//思路:快慢指针。pf1一次走两步,pf2一次走一步。当pf1 == pf2时,ptr从第一个节点与pf2同时前进,当相遇时,则是第一个入环的节点。
typedef struct ListNode LN;
struct ListNode *detectCycle(struct ListNode *head)
{
LN* pf1 = head;
LN* pf2 = head;
if(head==NULL||head->next==NULL)
{
return NULL;
}
while(pf1)
{
if(pf1->next==NULL)
{
return NULL;
}
pf1 = pf1->next->next;
pf2 = pf2->next;
if(pf1==pf2)
{
LN* ptr = head;
while(ptr!=pf2)
{
ptr = ptr->next;
pf2 = pf2->next;
}
return ptr;
}
}
return NULL;
}
3. 143. 重排链表 - 力扣(LeetCode)
//思路:本题的难点在于链表无法通过下标来访问其中的内容。但是我们知道数组可以通过下标来访问,那么很容易地可以想到用数据来解这道题。用一个数组1接收链表中每个节点val的值,再用一个数组2按照题目所给顺序从数组1中读取并存储val
typedef struct ListNode LN;
int ListNodeQua(LN* phead)//用于计算链表中节点个数
{
LN* pmove = phead;
int count = 0;
while(pmove)
{
count++;
pmove = pmove->next;
}
return count;
}
void reorderList(struct ListNode* head)
{
LN* pmove = head;
int n = ListNodeQua(head);
int* arr = (int*)malloc(sizeof(int)*n);//数组1
for(int i = 0;i<n;i++)//存储链表中的val
{
arr[i] = pmove->val;
pmove = pmove->next;
}
int* arr1 = (int*)malloc(sizeof(int)*n);//数组2
arr1[0] = arr[0];//第一个节点不变
int x = n-1;//尾下标
int y = 1;
for(int i = 1;i<n;i++)//按照题目所给顺序从数组1中拿取数据
{
if(i%2==1)
{
arr1[i] = arr[x];
x--;
}
else if(i%2==0)
{
arr1[i] = arr[y];
y++;
}
}
pmove = head;
int j = 0;
while(pmove)//最后再将数组2中的数据放入链表中
{
pmove->val = arr1[j++];
pmove = pmove->next;
}
}