数据结构与算法⑤(第二章OJ题,上)前五道链表面试题(下)

简介: 数据结构与算法⑤(第二章OJ题,上)前五道链表面试题

数据结构与算法⑤(第二章OJ题,上)前五道链表面试题(上):https://developer.aliyun.com/article/1513343

普通思路的代码:

struct ListNode* middleNode(struct ListNode* head){
    struct ListNode*cur=head;
    int count=0;
    while(cur!=NULL)
    {
        cur=cur->next;
        count++;//计算链表长度
    }
    struct ListNode*middle=head;
    for(int i=0;i<count/2;i++)//如5的话3次,6的话4次
    {
        middle=middle->next;
    }
    return middle;
}

这样的时间复杂度是N+N/2 虽然还是O(N)

但是以后面试可能会要求只能遍历一遍数组呢,这时就要用到快慢指针的思想了

虽然以前有用过,但是变一下就想不到了,看到这个思路又是震惊的一天...

运用快慢指针的代码:

struct ListNode* middleNode(struct ListNode* head) {
    struct ListNode* fast = head , * slow = head;
    while (fast!=NULL&&fast->next!=NULL)
    {
        fast=fast->next->next;//快指针一次走两步
        slow=slow->next;//慢指针一次走一步
    }
    return slow;
}

4. 输出该链表中倒数第k个结点

剑指 Offer 22. 链表中倒数第k个节点

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,

本题从1开始计数,即链表的尾节点是倒数第1个节点。

例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。

这个链表的倒数第 3 个节点是值为 4 的节点。

示例:

给定一个链表: 1->2->3->4->5, 和 k = 2.

返回链表 4->5.

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* getKthFromEnd(struct ListNode* head, int k){
 
}

(这题没给范围,有点不严谨,但是懂思路就好了)

力扣这题是后更新的,所以测试用例更不严谨

这里说一下,力扣应该是OJ题做的最好的,但是面试那些应该用牛客多一点。

牛客网链接:https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&&tqId=11167&rp=2&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

普通思路的代码:

这题和上一题的普通思路一样,相当于遍历两次链表

struct ListNode* getKthFromEnd(struct ListNode* head, int k){
    struct ListNode*cur=head;
    int count=0;
    while(cur!=NULL)
    {
        cur=cur->next;
        count++;//计算链表长度
    }
    struct ListNode*newHead=head;
    for(int i=0;i<count-k;i++)
    {
        newHead=newHead->next;
    }
    return newHead;
}

写完普通思路我想着用快慢指针怎么用,想了几秒就觉得不行就不想了,以为不能用

(不想动太多脑的坏处)看到别人的思路我已经开始咬嘴唇了...


虽然觉得k不一样时,时间一样,但是帅就对了:

运用快慢指针的代码:

struct ListNode* getKthFromEnd(struct ListNode* head, int k){
    struct ListNode* fast = head , * slow = head;
    while(k--)
    {
        if(fast==NULL)
        {
            return NULL;
        }
        fast=fast->next;//快指针先走k步
    }
    while(fast)
    {
        fast=fast->next;
        slow=slow->next;//快慢指针一起走
    }
    return slow;
}

5. 合并两个有序链表为一个新的有序链表

21. 合并两个有序链表

难度简单

将两个升序链表合并为一个新的 升序 链表并返回。

新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:



输入:l1 = [1,2,4], l2 = [1,3,4]

输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []

输出:[]

示例 3:

输入:l1 = [], l2 = [0]

输出:[0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1 和 l2 均按 非递减顺序 排列
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
 
}

尾插法代码:

 struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
     if (list1 == NULL)
     {
         return list2;
     }
     if (list2 == NULL)
     {
         return list1;
     }
     struct ListNode* cur=NULL;
     if(list1->val <= list2->val)
     {
        cur = list1;
        list1 = list1->next;
     }
     else
     {
        cur = list2;
        list2 = list2->next;
     }
     struct ListNode* new = cur;
     while (list1 && list2)
     {
         if (list1->val <= list2->val)
         {
             cur->next = list1;
             cur = list1;
             list1 = list1->next;
         }
         else
         {
             cur->next = list2;
             cur = list2;
             list2 = list2->next;
         }
     }
     if (list1 == NULL)
     {
         cur->next = list2;
     }
     else
     {
         cur->next = list1;
     }
     return new;
}

尾插法+哨兵位的头节点代码:

哨兵位的头节点就是不存数据的节点

 struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
     if (list1 == NULL)
     {
         return list2;
     }
     if (list2 == NULL)
     {
         return list1;
     }
     struct ListNode* cur = (struct ListNode*)malloc(sizeof(struct ListNode));
     struct ListNode* new = cur;
     while (list1 && list2)
     {
         if (list1->val <= list2->val)
         {
             cur->next = list1;
             cur = list1;
             list1 = list1->next;
         }
         else
         {
             cur->next = list2;
             cur = list2;
             list2 = list2->next;
         }
     }
     if (list1 == NULL)
     {
         cur->next = list2;
     }
     else
     {
         cur->next = list1;
     }
     struct ListNode* newHead = new->next;
     free(new);
     return newHead;
}

本篇完。

后面还有接着这部分的较难的OJ题

目录
相关文章
|
3月前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩分享分库分表的基因算法设计,涵盖分片键选择、水平拆分策略及基因法优化查询效率等内容,助力面试者应对大厂技术面试,提高架构设计能力。
美团面试:百亿级分片,如何设计基因算法?
|
3月前
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
40 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
3月前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
3月前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩在读者群中分享了关于分库分表的基因算法设计,旨在帮助大家应对一线互联网企业的面试题。文章详细介绍了分库分表的背景、分片键的设计目标和建议,以及基因法的具体应用和优缺点。通过系统化的梳理,帮助读者提升架构、设计和开发水平,顺利通过面试。
美团面试:百亿级分片,如何设计基因算法?
|
3月前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
37 7
|
3月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
102 2
|
4月前
|
机器学习/深度学习 JavaScript 算法
面试中的网红虚拟DOM,你知多少呢?深入解读diff算法
该文章深入探讨了虚拟DOM的概念及其diff算法,解释了虚拟DOM如何最小化实际DOM的更新,以此提升web应用的性能,并详细分析了diff算法的实现机制。
|
5月前
|
消息中间件 存储 算法
这些年背过的面试题——实战算法篇
本文是技术人面试系列实战算法篇,面试中关于实战算法都需要了解哪些内容?一文带你详细了解,欢迎收藏!
|
2天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
15天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
149 80

热门文章

最新文章