今日好题——单链表

博客IDLanFuRen
C系列专栏 C语言重点部分 C语言注意点 C++基础 Linux 数据结构 C++注意点 今日好题

声明等级:黑色->蓝色->红色

欢迎新粉加入,会一直努力提供更优质的编程博客,希望大家三连支持一下啦

​​​​​​合并两个有序链表

思路:我们创建一个新链表,比较链表1与链表2节点val的大小,不断尾插。

细节:这一题要注意的是链表的节点指针不仅仅代表着这一个节点,也可以代表从该节点往后链接成的链表。

cpp 复制代码
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。

循环条件的判断:尾指针就是头指针

cpp 复制代码
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;//尾指针,这样避免节点只有一个的问题
}
cpp 复制代码
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;
}
相关推荐
故事和你917 小时前
sdut-程序设计基础Ⅰ-实验五一维数组(8-13)
开发语言·数据结构·c++·算法·蓝桥杯·图论·类和对象
像污秽一样7 小时前
算法与设计与分析-习题4.2
算法·排序算法·深度优先·dfs·bfs
芯联智造8 小时前
【stm32简单外设篇】- WS2812单线地址式 RGB 灯带
c语言·stm32·单片机·嵌入式硬件
Storynone8 小时前
【Day20】LeetCode:39. 组合总和,40. 组合总和II,131. 分割回文串
python·算法·leetcode
明明如月学长9 小时前
AI 更新太快学不过来?我用OpenClaw打造专属AI学习工作流
算法
黎阳之光9 小时前
【黎阳之光:以无线专网与视频孪生,赋能智慧广电与数字中国】
算法·安全·智慧城市·数字孪生
刀法如飞10 小时前
Agentic AI时代,程序员必备的算法思想指南
人工智能·算法·agent
刀法如飞10 小时前
Agentic AI时代程序员必备算法思想详解(附实战案例)
算法·ai编程·编程开发·agentic
飞Link11 小时前
告别盲目找Bug:深度解析 TSTD 异常检测中的预测模型(Python 实战版)
开发语言·python·算法·bug
djarmy11 小时前
ubuntu20.04搭建openharmony6.0的master分支。构建编译环境报错解决记录
c语言·ubuntu