当前位置: 首页 > ai >正文

单链表专题---暴力算法美学(2)(有视频演示)

1.4 合并两个有序链表

/*** Definition for singly-linked list.* 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* l1=list1;ListNode* l2=list2;//创建一个新的链表ListNode* newHead,*newTail;newHead=newTail=NULL;//比大小while(l1 && l2)//其中一个走到空都要结束循环{if(l1->val < l2->val){//如果newHead为空if(newHead ==NULL){newHead=newTail=l1;}else{newTail->next=l1;newTail=newTail->next;}//把l1指向的数值拿来插入新链表l1=l1->next;}else{if(newHead==NULL){newHead=newTail=l2;}else{newTail->next=l2;newTail=newTail->next;}//把l2指向的数值拿下来插入l2=l2->next;}}if(l1){newTail->next=l1;}if(l2){newTail->next=l2;}return newHead;
}

代码优化一下!

/*** Definition for singly-linked list.* 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* l1=list1;ListNode* l2=list2;//创建一个新的链表ListNode* newHead,*newTail;newHead=newTail=(ListNode*)malloc(sizeof(ListNode));//比大小while(l1 && l2)//其中一个走到空都要结束循环{if(l1->val < l2->val){newTail->next=l1;newTail=newTail->next;//把l1指向的数值拿来插入新链表l1=l1->next;}else{newTail->next=l2;newTail=newTail->next;//把l2指向的数值拿下来插入l2=l2->next;}}if(l1){newTail->next=l1;}if(l2){newTail->next=l2;}//动态申请的空间要释放掉ListNode* ret=newHead->next;free(newHead);newHead=NULL;return ret;
}

视频讲解

合并两个有序链表解题思路

1.5 环形链表的约瑟夫问题

思路:1.创建带环链表

           2.计数

typedef struct ListNode ListNode;//创建节点ListNode* buyNode(int x) {ListNode* node = (ListNode*)malloc(sizeof(ListNode));if (node == NULL) {exit(1);}node->val = x;node->next = NULL;return node;}//创建带环链表ListNode* createCircle(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) {//1.根据n创建带环链表ListNode* prev = createCircle(n);ListNode* pcur = prev->next;int count = 1;//当链表中只有一个节点的时候结束循环while (pcur->next != pcur) {if (count == m) {//销毁pcur节点prev->next = pcur->next;free(pcur);pcur = prev->next;count = 1;} else {//此时不用销毁节点prev = pcur;pcur = pcur->next;count++;}}//此时剩下一个节点就是要返回的节点里面的值return pcur->val;}

环形链表的约瑟夫问题

1.6 面试题:02.04 分割链表

思路:1.创建一个大链表和一个小链表:

           2.遍历原链表,大于或等于x 的节点插入大链表,小于x的节点插入小链表:

           3.小链表的尾结点链接大链表的第一个有效节点

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* partition(struct ListNode* head, int x) {//判空,如果原链表为空链表if(head==NULL){return head;}//创建两个链表,一个大链表,一个小链表,大链表放大于或者等于x的值,小链表放小于x的值ListNode* lessHead,* lessTail;ListNode* greaterHead,* greaterTail;lessHead=lessTail=(ListNode*)malloc(sizeof(ListNode));greaterHead=greaterTail=(ListNode*)malloc(sizeof(ListNode));//遍历原链表,大链表放大于或者等于x的值,小链表放小于x的值ListNode* pcur=head;while(pcur){//大于x的值插入大链表if(pcur->val >= x){greaterTail->next=pcur;greaterTail=greaterTail->next;}else{//小于x的值插入小链表lessTail->next=pcur;lessTail=lessTail->next;}pcur=pcur->next;} greaterTail->next=NULL;//如果不加这一行代码会出现死循环+ next指针初始化//小链表的尾节点链接大链表的第一个有效的节点lessTail->next=greaterHead->next;ListNode* ret=lessHead->next;free(lessHead);free(greaterHead);lessHead=greaterHead=NULL;return ret;
}

博主的上一篇博客:单链表专题---暴力算法美学(1)(有视频演示)-CSDN博客

http://www.xdnf.cn/news/17400.html

相关文章:

  • Linux 系统中,如何处理信号以避免竞态条件并确保程序稳定性?
  • Oracle 19C 查看卡慢的解决思路
  • 使用快捷键将当前屏幕内容滚动到边缘@首行首列@定位到第一行第一个字符@跳转到4个角落
  • 【2025CVPR-图象去雾方向】BEVDiffuser:基于地面实况引导的BEV去噪的即插即用扩散模型
  • 诺基亚就4G/5G相关专利起诉吉利对中国汽车及蜂窝模组企业的影响
  • PHP项目运行
  • 亚麻云之数据安家——RDS数据库服务入门
  • Jenkins | 账号及权限管理
  • 从 GPT‑2 到 gpt‑oss:解析架构的迭代
  • 在windows安装colmap并在cmd调用
  • 设计模式(Design Pattern)
  • C++ 黑马 内存分配模型
  • 通过trae开发你的第一个Chrome扩展插件
  • 2025年APP开发趋势:4大方向重构行业格局
  • [激光原理与应用-224]:机械 - 机械设计与加工 - 常见的术语以及含义
  • python | numpy小记(十):理解 NumPy 中的 `np.random.multinomial`(进阶)
  • 医学统计(随机对照研究分类变量结局数据的统计策略2)
  • 面对信号在时频平面打结,VNCMD分割算法深度解密
  • 【接口自动化】-5- 接口关联处理
  • 比特币现货和比特币合约的区别与联系
  • 金融机构在元宇宙中的业务开展与创新路径
  • nginx+lua+redis案例
  • AI智能编程工具汇总
  • Numpy基础(通用函数)
  • [IOMMU]基于 AMD IOMMU(AMD‑Vi/IOMMUv2)的系统化总结与落地方案
  • 【C++】模版进阶
  • FMS 2025存储峰会获奖技术全景解读
  • C/C++基础详解(二)
  • AcWing 4579. 相遇问题
  • Day38 Dataset和Dataloader类