当前位置:   article > 正文

应对嵌入式校招面试手撕之——链表_嵌入式面试手撕的题型

嵌入式面试手撕的题型

笔者投的是嵌入式软件岗,发现手撕代码难度上比软件开发岗是要简单一些的,基本都是leetcode的medeium和easy的水平,基本难的算法不会考,集中在字符串处理和链表,现在把一些常见的链表题做一下。(以下题目均用c++,在类函数里实现)


1.leetcode 21 合并两个有序链表

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

这个题有两种算法,一种是常规算法,一种是递归算法,后者写出来感觉牛逼一点,但是容易出错。

方法一:

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode() : val(0), next(nullptr) {}
  7. * ListNode(int x) : val(x), next(nullptr) {}
  8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
  9. * };
  10. */
  11. class Solution {
  12. public:
  13. ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
  14. ListNode *dummy=new ListNode(0);//虚拟头结点不动
  15. ListNode *cur=dummy;//这个结点是变化的
  16. if(l1==nullptr)
  17. return l2;
  18. if(l2==nullptr)
  19. return l1;
  20. while(l1!=nullptr&&l2!=nullptr)
  21. {
  22. if(l1->val<l2->val)
  23. {
  24. cur->next=l1;
  25. l1=l1->next;
  26. }
  27. else
  28. {
  29. cur->next=l2;
  30. l2=l2->next;
  31. }
  32. cur=cur->next;
  33. }
  34. if(l1!=nullptr)
  35. cur->next=l1;
  36. else
  37. cur->next=l2;
  38. return dummy->next;
  39. }
  40. };

方法2:递归算法

终止条件:当两个链表都为空时,表示我们对链表已合并完成。
如何递归:判断 l1 和 l2 头结点哪个更小,然后较小结点的 next 指针指向其余结点的合并结果。(调用递归)

  1. class Solution {
  2. public:
  3. ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
  4. if(l1==nullptr)
  5. return l2;
  6. if(l2==nullptr)
  7. return l1;
  8. if(l1->val<=l2->val)
  9. {
  10. l1->next=mergeTwoLists(l1->next,l2);//较小结点的next指向其余结点
  11. return l1;
  12. }
  13. else
  14. {
  15. l2->next=mergeTwoLists(l1,l2->next);
  16. return l2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/661757
推荐阅读
相关标签
  

闽ICP备14008679号