首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么排序链表上的merge实现总是将两个列表都设置为NULL,而实际上只有一个应该设置为NULL?

在排序链表上执行merge操作时,通常会将两个列表都设置为NULL。这是因为在merge操作的过程中,我们需要不断比较两个链表中的节点,并将较小的节点链接到新的结果链表中。当其中一个链表遍历完毕后,另一个链表中剩余的节点就可以直接链接到结果链表的末尾,而不需要再经过比较。

具体来说,merge操作会维护一个指向结果链表的指针,以及两个指向原始链表的指针。在比较两个链表中节点的值时,如果当前节点值较小,则将其链接到结果链表,并将对应链表的指针后移一位。当其中一个链表的指针移到末尾时,就可以将另一个链表的剩余部分直接链接到结果链表的末尾,而不需要再经过比较。

因此,在merge操作完成后,两个链表都会被设置为NULL,表示它们已经完全合并到结果链表中。这样做可以确保在后续操作中不会继续访问到原始链表的节点。

值得注意的是,如果只有一个链表为空,而另一个链表还有剩余节点,那么在merge操作完成后,非空的链表指针会指向剩余节点的最后一个节点。因此,在实际应用中,我们通常会在merge操作之前进行判断,如果其中一个链表为空,直接返回另一个链表的头节点作为结果链表。

推荐的腾讯云相关产品:无

参考链接:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

面试官系列 - LeetCode链表知识点&题型总结

双向链表 ​ 双向链表支持两个方向,每个节点不只有一个后驱指针next指向后面的节点,还有一个前驱指针prev指向前面的节点。...我们假设一个有环链表,快慢指针最后都会走到环,而这个环就像一个环形跑道一样,慢指针在后面,快指针在前面,但实际上快指针也在追慢指针,希望能超慢指针一圈。...我们不用担心快指针跳过了慢指针,因为他们两速度差是1,所以它们在环距离总是每次减1,最后总能减到0。...二是,归并排序merge阶段需要辅助数组,需要申请O(N)空间,申请空间也是需要时间快排不需要额外申请空间。如果待排序元素存储在链表中,快排优点就变成了缺点。...链表链表只有一个结点 链表中只包含两个结点 代码在处理头结点跟尾结点是否存在什么问题 参考资料: 1.https://leetcode-cn.com/problems/sort-list/discuss

67910

LeetCode链表知识点&题型总结

1、我们定义两个指针,分别称之为g(guard 守卫)和p(point)。 我们首先根据方法参数m确定g和p位置。g移动到第一个要反转节点前面,p移动到第一个要反转节点位置。...例题:21 Merge Two Sorted Lists 【easy】 题意:两个排序链表合并成新有序链表 test case: Input: 1->2->4, 1->3->...我们假设一个有环链表,快慢指针最后都会走到环,而这个环就像一个环形跑道一样,慢指针在后面,快指针在前面,但实际上快指针也在追慢指针,希望能超慢指针一圈。...二是,归并排序merge阶段需要辅助数组,需要申请O(N)空间,申请空间也是需要时间快排不需要额外申请空间。如果待排序元素存储在链表中,快排优点就变成了缺点。...链表链表只有一个结点 链表中只包含两个结点 代码在处理头结点跟尾结点是否存在什么问题 参考资料: 1.https://leetcode-cn.com/problems/sort-list/discuss

1.6K10
  • 【29期】Java集合框架 10 连问,你有被问过吗?

    HashMap 是 HashTable 轻量级实现,他们完成了Map 接口,主要区别在于 HashMap 允许 null key 和 null value,由于非线程安全,效率可能高于 Hashtable...区别: HashMap允许 null 作为一个 entry key 或者 value, Hashtable 不允许。...封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中集合元素实际上由 HashMap key 来保存, HashMap value 则存储了一个 PRESENT...2.TreeSet:TreeSet实现了SortedSet接口,能够对集合中对象进行排序。 Map(映射) Map是一种把键对象和值对象映射集合,它一个元素包含一个键对象和值对象。...Map主要有以下实现类: HashMap:HashMap基于散列表实现,其插入和查询开销是固定,可以通过构造器设置容量和负载因子来调整容器性能。

    59730

    29. Java集合框架 10 连问,你有被问过吗?

    HashMap 是 HashTable 轻量级实现,他们完成了Map 接口,主要区别在于 HashMap 允许 null key 和 null value,由于非线程安全,效率可能高于 Hashtable...区别: HashMap允许 null 作为一个 entry key 或者 value, Hashtable 不允许。...封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中集合元素实际上由 HashMap key 来保存, HashMap value 则存储了一个 PRESENT...TreeSet:TreeSet实现了SortedSet接口,能够对集合中对象进行排序。 Map(映射) Map是一种把键对象和值对象映射集合,它一个元素包含一个键对象和值对象。...Map主要有以下实现类: HashMap:HashMap基于散列表实现,其插入和查询开销是固定,可以通过构造器设置容量和负载因子来调整容器性能。

    600

    2023年前端面试题汇总-数据结构(链表

    这个时候就会造成空间浪费,所以,数组空间利用率相当于本来需要大小除以创建出来数组大小。 因为链表元素只有当需要时候才会被创建出来,所以不存在需要多预留空间情况。...链表操作 在实现链表时候,通常在链表前面加一个假头,所谓假头,通常也叫作 Dummy Head 或者“哑头”。实际上,就是在链表前面,加上一个额外结点。...链表组件 给定链表头结点 head,该链表每个结点都有一个 唯一整型值 。同时给定列表 G,该列表是上述链表中整型值一个子集。...对于链表操作,实际上我们是在操作链表指针。...迭代实现 对于迭代方式,我们可以创建一个哑结点list,这个节点指向题目给出节点头结点。初始化一个temp,用来保存这个哑结点,初始值list,每次交换交换temp后面的两个节点。

    1.1K111

    链表排序总结(全)(C++)

    排序链表 里面,就会因为超出时间限制没法通过最后一个测试用例。 可以看到,如果可以交换节点值,那使用插入、快排这些顺序遍历可以实现算法都是可以(当然,快排就不能使用双指针法了)。...一节为什么说插入比冒泡更简单呢(无论是链表还是数组,一般优先使用插入排序),看下面的图,如果当前要将节点cur插入到节点pre之后: 可以看到整体操作逻辑简单了许多:我们只需要知道cur前驱和插入位置...数组merge函数我们已经很熟悉了: 需要一个辅助数组,大小与A[p…r]相同,双指针i,j分别指向两个待合并数组开头,假设为A[p…q],A[q+1,r]: 比较A[i]与A[j],较小者放入辅助数组并移动指针指向下一个元素...,右边界增加1 ++j; } swap(a[low], a[i-1]); return i-1; } 为什么要强调第二种我叫不名字方法以及它以开头pivot版本呢,因为接下来我们要用在链表快速排序上面...首先想想我们为什么不用双指针法,因为双指针需要从后往前遍历啊,链表是没法从后往前遍历

    77210

    13.2 具体集合

    如果链表只有很少几个元素,就完全不必担心get方法和set方法开销带来烦恼。   为什么优先使用链表?唯一理由是尽可能减少在列表中间插入或删除元素所付出代价。...排序是按照树结构来实现(在这里使用是红黑树red-black tree),每次讲一个数据添加到树中,都被放置在正确排序位置,因此,迭代器总是以排好序顺序访问每个元素。...只有两个正整数进行比较时候,才能使用上述方法进行,直接返回它们差值,如果x是一个较大正整数,y是一个绝对值较大负整数,x - y可能会溢出。   ...Java类库映射表提供了两个通用实现:HashMap和TreeMap,这两个实现了Map接口。   散列映射表对键进行散列,树映射表用键整体顺序对元素进行排序,并将其组织成搜索树。...如果对同一个键两次调用put方法,第二个值就会取代第一个值。实际上,put返回这个键参数存储一个值。

    1.8K90

    Java基础

    ,那么对这同一个对象调用多次,hashCode方法必须始终如一地返回同一个整数 如果两个对象通过equals方法比较得到结果是相等,那么对这两个对象进行hashCode得到应该相同 两个不同对象...它是HashMap子类,在HashMap数据结构基础,还维护着一个双向链表链接所有元素,这个链表定义了迭代顺序,同HashMap一样,key只可以有一个null,value可以有多个null 支持两种排序...数据结构里删除,同时将其从链表里面删除 TreeMap LinkedHashMap虽然可以根据插入顺序和访问顺序排序,但是无法自定义排序规则,TreeMap可以 实现基于红黑树,key不能为null,...,无序,可以存null 对于添加到HashSet中元素,需要重写hashCode和equals方法 在添加一个元素时候,实际上将该元素作为HashMap中key,所有元素值,其实是一个final...假如我们某个ThreadLocal对象引用设置null,但线程中threadLocals属性还指向了那个ThreadLocalMap对象,即存在一条强引用.

    59610

    Sort List 解题报告(归并排序小结)

    1) If head == NULL or 只有一个元素     return head. 2) else 链表分为两个部分,         pSlow是中点; /* pFast, pSlow指针找到中点...,原来递归过程是排序集合一分二,直至排序集合就剩下一个元素位置,然后不断合并两个排好序数组。...所以非递归思想为,数组中相邻元素两两配对。用merge函数将他们排序,构成n/2组长度gap2排序子数组段,然后再将他们排序成长度4子数组段,如此继续下去,直至整个数组排好序。...先将1+1(gap=1)个只有1个结点链表按二路归并方法加到tail结点后面,然后更新tail;接着2+2(gap=2)个分别有序链表按二路归并方式加到当前tail结点后面,然后更新tail...: #include using namespace std; // 数组中连续两个子序列合并为一个有序序列 void Merge(int* arr, int *tempArr,

    82630

    前端算法系统练习: 链表篇完结

    那在实现应该注意一些什么问题呢? 保存后续节点。作为新手来说,很容易当前节点 next指针直接指向前一个节点,但其实当前节点下一个节点指针也就丢失了。...由③式,慢指针走了(m - n) * S - Y个单位,以环起点参照物,相遇时位置 Y,现在由Y + (m - n) * S - Y即(m - n) * S,得知慢指针实际上参照环起点,走了整整...; }; 链表合并 No.1 合并两个有序链表 两个有序链表合并为一个有序链表并返回。...在这里需要提醒大家是,在自下而上实现方式中,我一个链表绑定了一个虚拟头指针(dummyHead),为什么这么做?...两个条件,在奇数情况下,总是 fast空先出现,偶数情况下,总是fast.next先出现.

    35210

    Java 集合源码详解

    通过无参构造方法来创建 ArrayList 时,它大小其实是 0 只有在使用到时候,才会通过 grow 方法去创建一个大小 10 数组。...final Node newNode = new Node(l, e, null); //并把这个新增设置 最后一个节点!...不一致添加HaseSet集合 Java 中进行比较方法我们也知道是 equals() , equals其实本质就是 == 比较地址, 上面两个对象地址不同当然不同,所以是唯一!...执行之后, 发现效果并不变, 还是两个 id=1 name=张三 总结: ❗ HashSet 本质就是一个: 数组+链表 初始容量16,当如果使用率超过0.75 负载因子(16*0.75...重写 equals() 方法 当一个类有自己特有的“逻辑相等”概念 改写equals()时候, 总是要改写hashCode(),根据一个equals方法(改写后) 两个截然不同实例有可能在逻辑是相等

    12710

    Java集合框架

    ()返回nullremove()会抛出一个异常。...,本质是LinkedHashMap实现 底层数据结构由哈希表(是一个元素链表数组)和双向链表组成。...接口抽象类 在之前版本中,HashMap采用数组+链表实现,即使用链表处理冲突,同一hash值链表存储在一个链表里(和我们在之前自行实现哈希表相同)。...JDK1.8中,HashMap采用数组+链表+红黑树(一种平衡搜索二叉树)实现,当链表长度超过阈值(8)时,链表转换为红黑树,这样大大减少了查找时间 和Vector类似,Map体系也有一个自JDK1.2...,发现它只有一个构造函数和一个 get() 方法,而且它 get() 方法仅仅是返回一个null,也就是说永远无法通过虚引用来获取对象,虚引用必须要和 ReferenceQueue 引用队列一起使用

    1.3K10

    数据结构、算法与应用 习题6.1 p124

    重载[] 复杂度O(n) 实际上重载应该包含两种,分别是提供左值,右值返回。...左移元素 leftShift 对于链表来说,左移实际上就是从左侧开始删除n个元素。并将首元素链接到最后删除位置一个元素。当n大于size()时候,应该是空链表。或者抛出索引错误。...直到末元素,末元素prev设置header,或者首元素next设置rear。...插入排序遍历复杂度是O(n),每一次取到一个元素,需要在前置序列中找到一个合适位置,这个查找过程复杂度渐进来说也是O(n),所以最坏复杂度是O(n²) n²/2 最好情况复杂度实际上刚好是逆序...选择排序 实际上和上面已经重复了,在我自己理解中,冒泡排序和和选择排序没有什么本质区别。 因为本质他们都是每一轮最后一个元素归位,属于减治之。

    27030

    Java集合框架常见面试题

    内存空间占用: ArrayList 空 间浪费主要体现在在 list 列表结尾会预留一定容量空间, LinkedList 空间花费则体现在它一个元素需要消耗比 ArrayList 更多空间...为什么呢?我觉得还是和底层数据结构有关!ArrayList 底层是数组, LinkedList 底层是链表。数组天然支持随机访问,时间复杂度 O(1),所以称为快速随机访问。...obj)方法用来排序 comparator接口实际上是出自 java.util 包它有一个compare(Object obj1, Object obj2)方法用来排序 一般我们需要对一个集合使用自定义排序时...,不是转换为红黑树)时,链表转化为红黑树,以减少搜索时间。...这也就解释了 HashMap 长度为什么是 2 幂次方。 这个算法应该如何设计呢? 我们首先可能会想到采用%取余操作来实现

    63021

    彻底理解HashMap及LinkedHashMap

    实际上,经典HashMap就是一个链表数组,只是jdk1.8再次对经典hashMap数据结构作了小幅调整,如下是当前HaspMap数据结构: ?...在JDK1.6和JDK1.7中,HashMap采用数组+链表实现,即使用链表处理冲突,同一hash值key-value键值对存储在一个链表里。...最理想效果是,Node数组中每个位置只有一个元素,这样,查询时候效率最高,不需要遍历单链表,也不需要通过equals去比较Key,而且空间利用率最大。 那如何计算才会分布最均匀呢?...类似于一小节为什么HashMap中数组长度总是取2整数次幂。...1.7 HashMap线程不安全 所有人知道HashMap是线程不安全,我们应该使用ConcurrentHashMap。但是为什么HashMap是线程不安全呢?

    1.2K40

    java集合详解完整版(超详细)「建议收藏」

    内存空间占用: ArrayList空 间浪费主要体现在在list列表结尾会预留一定容量空间,LinkedList空间花费则体现在它一个元素需要消耗比ArrayList更多空间(因为要存放直接后继和直接前驱以及数据...TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序默认排序方式。向 TreeSet中加入应该是同一个对象。...另外,HashTable 基本被淘汰,不要在代码中使用它; 对Null key 和Null value支持: HashMap 中,null 可以作为键,这样只有一个,可以有一个或多个键所对应...也就是说 HashMap 总是使用2幂作为哈希表大小,后面会介绍到为什么是2幂次方。...接口实际上是出自 java.util 包它有一个compare(Object obj1, Object obj2)方法用来排序 Map类似,是一种数组和链表结构,一个 Segment 包含一个 HashEntry

    93220

    Java集合基础知识

    为什么 线程不安全 首先HashMap不是线程安全; 如果有两个线程A和B,进行插入数据,刚好这两条不同数据经过哈希计算后得到哈希码是一样,且该位 置还没有其他数据。...如果同一个格子里key不超过8个,使用链表结构存储。 如果超过了8个,那么会调用 treeifyBin 函数,链表转换为红黑树。...ComparableTimSort.sort() : Timsort 排序 Timsort 排序是结合了合并排序merge sort)和插入排序(insertion sort)得出排序算法...排序输入单位不是一个个单独数字,而是一个块-分区。其中每一个分区叫一个run。针对这 些 run 序列,每次拿一个 run 出来按规则进行合并。每次合并会将两个 run合并成一个 run。...合并结果保 存到栈中。合并直到消耗掉所有的 run,这时剩余 run合并到只剩一个 run 为止。这时这个仅剩 run 便是排好序结果。

    5410

    最全集合干货送给大家

    HashSet 类 HashSet 类是 Set 接口实现类,由哈希表支持(实际上 HashSet 是 HashMap 一个实例)。...一个优先级队列不允许 null 元素依赖于自然排序优先级队列也不允许插入不可比较对象(这样做可能导致 ClassCastException )。 队列头在某种意义是指定顺序最后一个元素。...list 迭代器 set 方法,对于可变大小列表,程序员应该额外实现迭代器 r emove 方法 和 add 方法 LinkedList 类 LinkedList 是一个双向链表实现了所有 List...它主要特性如下: LinkedList 所有的操作都可以表现为双向性,索引到链表操作遍历从头到尾,视哪个距离近遍历顺序。...一般用途 map 实现应该提供两个标准构造器:一个空 map 创建一个 void (无参数)构造器。和一个只有单个 Map 类型参数构造器。

    63410

    猫眼面经汇总

    CMS垃圾收集器 类加载机制和双亲委派模型,以及为什么实现双亲委派模型 虚拟机调优参数 三、数据结构与算法 链表反转 当前节点和下一节点保存起来,然后当前节点反转。...} //如果headnull时候,pre就为最后一个节点了,但是链表已经反转完毕,pre就是反转后链表一个节点 //直接输出pre就是我们想要得到反转后链表...public ListNode ReverseList(ListNode head) { //如果链表空或者链表只有一个元素 if (head == null ||...for (int i = 0; i < array.length - 1; i++) { flag = false;//每次开始排序前,设置flag排序过...Merge Sorted Array(合并两个有序数组) * 给定两个有序整数数组 nums1 和 nums2, nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

    99830

    四大集合20连问,抗住!

    另外ArrayList底层存储容器实际上也是一个Object数组,大家看看以下源码。...List和Deque接口双向链表实现实现所有可选列表操作,并允许所有元素(包括null )。 所有操作执行方式符合双向链表预期。...当A线程把A元素设置头节点后,此时头节点还没有和旧链表建立连接。线程B执行时又把B元素设置为了头节点,注意!此时A元素被覆盖了。 以上两个线程两个添加操作最终却只添加了一个元素。...来看看官方源码解释。 此类实现Set接口,由哈希表(实际上是HashMap实例)支持。它不保证集合迭代顺序;特别是,它不保证顺序随时间保持不变。此类允许null元素。...我们创建一个HashSet对象,实际上底层创建了一个HashMap对象。

    13432
    领券