博客ID:LanFuRen
C系列专栏:C语言重点部分 C语言注意点 C++基础 Linux 数据结构 C++注意点 今日好题
声明等级:黑色->蓝色->红色欢迎新粉加入,会一直努力提供更优质的编程博客,希望大家三连支持一下啦
思路:我们创建一个新链表,比较链表1与链表2节点val的大小,不断尾插。
细节:这一题要注意的是链表的节点指针不仅仅代表着这一个节点,也可以代表从该节点往后链接成的链表。
struct ListNode {
int val;
struct ListNode *next;
};
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
if (list1 == NULL)
return list2;
if (list2 == NULL)
return list1;
ListNode* lt1, * lt2;
lt1 = list1;
lt2 = list2;
ListNode* newhead, * newtail;
newhead = newtail = NULL;//新建链表,头尾指针,一直改变尾指针,头指针相当于记录头
while (lt1 && lt2)
{
//链表1小
if (lt1->val < lt2->val)
{
if (newhead == NULL)
newhead = newtail = lt1;
else
{
newtail->next = lt1;
newtail = newtail->next;
}
lt1 = lt1->next;
}
//链表2小
else
{
if (newhead == NULL)
newhead = newtail = lt2;
else
{
newtail->next = lt2;
newtail = newtail->next;
}
lt2 = lt2->next;
}
//细节
//链表1或链表2到达尾
if (lt1)
newtail->next = lt1;
if (lt2)
newtail->next = lt2;
}
return newhead;
}
思路:我们要首先构建出一个环形链表
然后进入循环,假如m=2,如果count没有=1链表就往后走,反之就删除这个节点,然后将计数器置为1。
循环条件的判断:尾指针就是头指针
typedef struct ListNode ListNode;
ListNode* BuyNode(int x)
{
ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
newnode->val = x;
newnode->next = NULL;
return newnode;
}
ListNode* CreateNewList(int n)
{
ListNode* phead = BuyNode(1);//报数
ListNode* ptail = phead;
for (int i = 2; i <= n; ++i)
{
ptail->next = BuyNode(i);
ptail = ptail->next;
}
ptail->next = phead;//成环
return ptail;//尾指针,这样避免节点只有一个的问题
}
int ysf(int n, int m) {
ListNode* prev = CreateNewList(n);//尾指针
ListNode* pcur = prev->next;//头指针
int count = 1;//计数器
while (pcur->next != pcur)//注意判断条件
{
if (count == m)
{
prev->next = pcur->next;//掉队,改变链接
free(pcur);
pcur = prev->next;
count = 1;//掉队之后重置计数器
}
else
{
prev = prev->next;
pcur = pcur->next;
count++;
}
}
return prev->val;
}