力扣-21-合并两个有序链表/剑指Offer-25-合并两个排序的链表

image

编码思路

首先是递归排序过程

  1. 比较两个链表的头节点大小,将更小的节点作为结果链表的头节点,并将这个节点从原链表中删除
  2. 递归地重复上述过程,直到两个链表都为空

要注意的情况是

  1. 当两个链表中某一个/全都为空
  2. 某一个链表的节点被一个个取出后变成了空链表

好像还没用过STL-list,简单去学习下

  1. STL-list为双向链表
  2. 不能通过下标直接访问人元素

实际场景中,如何需要对序列进行大量添加或删除元素的操作,而直接访问元素的需求却很少,这种情况建议使用 list 容器存储序列。

  1. 可以拷贝容器
    std::list<int> value1(10); std::list<int> value2(value1);
  2. 通过拷贝其他类型容器(或者普通数组)中指定区域内的元素,可以创建新的 list 容器。
//拷贝普通数组,创建list容器
int a[] = { 1,2,3,4,5 };
std::list<int> values(a, a+5);
//拷贝其它类型的容器,创建 list 容器
std::array<int, 5>arr{ 11,12,13,14,15 };
std::list<int>values(arr.begin()+2, arr.end());//拷贝arr容器中的{13,14,15}

编写代码

题目中给出的是一个单向链表,只包含节点值和后指针
啊……所以不关list的事……

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        if(list1 == nullptr){
            return list2;
            // 这里list2其实有两种情况,为空和不为空
            // 但其实无论哪种情况都无所谓
        }else if(list2== nullptr){
            return list1;
        }
        ListNode* head;
        if(list1->val>list2->val){
            head = list2;
            head->next = mergeTwoLists(list1,list2->next);
            // 写了半天没写出来关键是没有理解这个方法的返回值
            // 递归地返回:对两个链表的头节点进行比较后,选择出的较小元素的指针
        }else{
            head= list1;
            head->next = mergeTwoLists(list1->next,list2);
        }
        return head;
    }
};

image

写了一个小时没写出来,着实拉跨
复盘一下,这也是第一次写链表相关的题吧,最关键的是:没有理解到方法返回值——节点指针的对于解体意义。
本来口口声声说递归,结果写着写着就跑去绞尽脑汁写循环了

2024.7.24 重做

遇上又没做出来

    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        if (list1 == null) return list2;
        else if (list2 == null) return list1;
        ListNode head;
        if (list1.val > list2.val) {
            head = list2;
            head.next = mergeTwoLists(list1, list2.next);
        } else {
            head = list1;
            head.next = mergeTwoLists(list1.next, list2);
        }
        return head;
    }

每一层递归做了两件事

  1. 返回两个链表头节点中较小的那个
  2. 创建一个新节点,为它赋值并修改 next 指针指向
    最终形成一个创建新链表的过程
posted @ 2022-04-19 12:02  YaosGHC  阅读(30)  评论(0编辑  收藏  举报