• 链表OJ题


    一、合并两个有序链表(leetcode_21)

    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

    【思路】创建一个新的链表(malloc),两个链表的元素依次比较大小,较小就放到新的链表里,直至其中一个链表为空,再将另一个链表剩下的部分接上

    注意链表为空的情况要分开讨论

    1. struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    2. struct ListNode* cur1 = list1;
    3. struct ListNode* cur2 = list2;
    4. struct ListNode* tmp =(struct ListNode*)malloc(sizeof(struct ListNode));
    5. struct ListNode* cur = tmp;
    6. if(cur1 == NULL && cur2 == NULL)
    7. return NULL;
    8. else if(cur1 == NULL)
    9. return cur2;
    10. else if(cur2 == NULL)
    11. return cur1;
    12. while(cur1 && cur2)
    13. {
    14. if(cur1->val >= cur2->val)
    15. {
    16. cur->next = cur2;
    17. cur2 = cur2->next;
    18. }
    19. else
    20. {
    21. cur->next = cur1;
    22. cur1 = cur1->next;
    23. }
    24. cur = cur->next;
    25. }
    26. if(cur1!=NULL)
    27. {
    28. cur->next=cur1;
    29. }
    30. if(cur2!=NULL)
    31. {
    32. cur->next=cur2;
    33. }
    34. return tmp->next;
    35. }


    二、反转链表(leetcode_206)

    给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 

    【思路】创建三个指针,前两个指针用来转变指向,第三个指针为了保存下一个,方便下一次转换

    【图解】

     step1

    step2

    step3

    step4

    依次循环即可

    1. struct ListNode* reverseList(struct ListNode* head) {
    2. if(head == NULL)
    3. {
    4. return NULL;
    5. }
    6. struct ListNode* n1 = NULL;
    7. struct ListNode* n2 = head;
    8. struct ListNode* n3 = head->next;
    9. while(n2)
    10. {
    11. n2->next = n1;
    12. n1 = n2;
    13. n2 = n3;
    14. if(n2) //避免对空指针解引用
    15. n3 = n2->next;
    16. }
    17. return n1;
    18. }


    三、链表中间结点(leetcode_876)

    给你单链表的头结点 head ,请你找出并返回链表的中间结点。

    如果有两个中间结点,则返回第二个中间结点。

    【思路】创建两个指针,一个一次走一步,另一个一次走两步,快指针走到末尾时慢指针指向中间结点

    如果是奇数个结点,当快指针指向最后一个结点时结束,慢指针指向中间结点;

    如果是偶数个结点,当快指针指向空时结束,慢指针指向第二个中间结点;

    【图解】

    1. typedef struct ListNode Node;
    2. struct ListNode* middleNode(struct ListNode* head){
    3. Node* slow = head;
    4. Node* fast = head;
    5. while(fast != NULL && fast->next != NULL)
    6. {
    7. slow = slow->next;
    8. fast = fast->next->next;
    9. }
    10. return slow;
    11. }


    四、链表的回文结构(牛客OR36)

    对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

    给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

    样例:1->2->2->1                         

    返回:true

    【思路】这道题可以拆解为中间结点反转链表两个部分,也就是第二题和第三题的结合,思路都是和上面一样的。然后从两边开始遍历,直到遍历到中间结点停止,若全都相等返回true,反之返回false

    1. bool chkPalindrome(ListNode* A) {
    2. ListNode* fast = A, *slow = A;
    3. ListNode* cur = A;
    4. while(fast)
    5. {
    6. slow = slow->next;
    7. if(fast->next)
    8. fast = fast->next->next;
    9. else
    10. break;
    11. }
    12. ListNode* n1 = NULL, *n2 = A, *n3 = A->next;
    13. while (n1 != slow)
    14. {
    15. n1 = n2;
    16. n2 = n2->next;
    17. n3 = n2->next;
    18. }
    19. while(n2)
    20. {
    21. n2->next = n1;
    22. n1 = n2;
    23. n2 = n3;
    24. n3 = n2->next;
    25. }
    26. while(1)
    27. {
    28. if(cur->val == n1->val)
    29. {
    30. cur = cur->next;
    31. n1 = n1->next;
    32. if(cur == slow)
    33. return true;
    34. }
    35. else
    36. return false;
    37. }
    38. }

    你学会了吗?

  • 相关阅读:
    在SpringBoot项目中整合拦截器
    Apifox实战——微信的第三方小程序提审发布
    kotlin实现LRUCache
    python 碰到问题
    Python一周小结
    idea 找不到类 could not find artifact
    使用docker简单编译k20pro内核
    Visual Studio主题颜色及字体
    Tomcat无法映射到activiti-app导致activiti无法启动页面
    学内核之十一:ARM64屏障指令使用指南
  • 原文地址:https://blog.csdn.net/m0_73969414/article/details/134480128