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

以最有效的方式合并两个排序的链表

合并两个排序的链表是指将两个已排序的链表合并为一个新的排序链表。下面是一个有效的方式来实现这个操作:

  1. 创建一个新的链表头节点,并用一个指针指向它。
  2. 比较两个链表的头节点的值,将较小的节点连接到新链表的下一个节点,并将指针移动到新链表的下一个节点。
  3. 重复步骤2,直到其中一个链表为空。
  4. 将另一个非空链表的剩余部分连接到新链表的末尾。
  5. 返回新链表的头节点。

这种方法的时间复杂度是O(n),其中n是两个链表的总长度。

这个问题可以使用递归或迭代的方式来解决。下面是一个使用迭代的示例代码:

代码语言:python
代码运行次数:0
复制
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def mergeTwoLists(l1, l2):
    dummy = ListNode(0)  # 创建一个虚拟头节点
    curr = dummy  # 指针指向虚拟头节点

    while l1 and l2:
        if l1.val < l2.val:
            curr.next = l1
            l1 = l1.next
        else:
            curr.next = l2
            l2 = l2.next
        curr = curr.next

    # 将剩余的链表连接到新链表的末尾
    if l1:
        curr.next = l1
    if l2:
        curr.next = l2

    return dummy.next  # 返回新链表的头节点

这个算法的优势是简单、高效,并且不需要额外的空间。它可以应用于合并两个有序链表的场景,比如合并两个有序的用户列表、合并两个有序的日志文件等。

腾讯云提供了云计算相关的产品和服务,其中包括云服务器、云数据库、云存储、人工智能等。具体推荐的产品和产品介绍链接地址可以根据实际需求和场景来选择。

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

相关·内容

合并两个排序的链表

前言 给定两个递增排序的链表,如何将这两个链表合并?合并后的链表依然按照递增排序。本文就跟大家分享一种解决方案,欢迎各位感兴趣的开发者阅读本文。...同样的,这个问题也可以用双指针的思路来实现: p1指针指向链表1的头节点 p2指针指向链表2的头节点 声明一个变量存储合并后的链表,比对两个指针指向的节点值大小: 如果p1指针指向的节点值比p2指向的值小...,合并后的链表节点就取p1节点的值,p1指针继续向前走,进行下一轮的比对 如果p2指针指向的节点值比p1指向的值小,合并后的链表节点就取p2节点的值,p2指针继续向前走,进行下一轮的比对 当p1节点指向...null时,合并后的链表节点就为p2所指向的链表节点;当p2节点指向null时,合并后的链表节点就为p1所指向的链表节点。...没错,这就是典型的递归思路,代码如下: 声明一个函数MergeLinkedList,它接受2个参数:递增排序的链表1,递增排序的链表2 递归的基线条件:链表1为null就返回链表2,链表2为null就返回链表

84710
  • 合并两个排序的链表

    题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如下图中的链表1和链表2,则合并之后的升序链表如链表3所示。...注:链表1和链表2是两个递增排序的链表,合并这两个链表得到升序链表为链表3. 首先分析合并两个链表的过程。我们的分析从合并两个链表的头结点开始。...在两个链表中剩下的结点依然是排序的,因此合并这两个链表的步骤和前面的步骤是一样的。我们还是比较两个头结点的值。...当我们得到两个链表中值较小的头结点并把它连接到已经合并的链表之后,两个链表剩余的结点依然是排序的,因此合并的步骤和之前的步骤是一样的。这就是典型的递归的过程,可以定义递归函数来完成者以合并过程。...同样,当输入的第二个链表的头结点是空指针时,我们把它和第一个链表合并得到的结果就是第一个链表。如果两个链表都是空链表,合并的结果是得到一个空链表。

    1.1K80

    算法-合并两个排序的链表

    题目: 输入两个递增排序的链表,合并着两个链表并使新链表中的结点仍然是按照递增顺序的。例如输入的链表1和链表2如下,合并后的为链表3。...解题思路: 首先可以确定的是,链表1和链表2本身就是递增的,所以合并的过程可以从链表1,2的头结点开始,先比较1,2的头结点中值的大小,将小的值的结点(比如为链表1头结点)作为合并后的链表(链表3)...个人感觉值得注意的地方有下面几个: (1)如果链表1,2为空,要考虑代码的鲁棒性。 (2)要考虑链表1,2中某结点的数值相等的情况,这个在else中包含了。 ? (3)递归调用何时退出?...return pHead1; 这就是这个代码很巧妙的地方,往往使一行代码两个甚至多个作用,我们举这样的例子: 链表1 : 1 3 链表2 : 2 4 首先执行...(4)新的链表何时链接?

    854100

    合并两个排序的单链表

    【题目】 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是依照递增排序的。...---- 【分析】 合并单链表,须要找到头结点,对照两个链表头结点后,确定头结点,再确定头结点下一个结点,循环递归的如前面一样操作确定每一个结点位置,同一时候考虑边界条件,假设两个链表为空。...则肯定无需合并了,就是空链表,假设一个链表为空,还有一个不为空,则返回不为空的链表。...,告诉指针要指向的地址就要付给它一个结构类型地址 }; //链表初始化 node_t * init() { node_ptr p; p = (node_t *)malloc(sizeof...printf("\n"); node_t *merge_list = merge(list1->node_next, list2->node_next); printf("合并单链表顺序为

    43510

    leetcode链表之合并两个排序的链表

    序 本文主要记录一下leetcode链表之合并两个排序的链表 Sort-Linked-List.png 题目 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 ​...{ cursor.next = l1; } ​ return newHead.next; } } 这里先创建一个newHead节点来表示合并后链表的头指针...,然后创建一个cursor,其初始值为newHead;之后同时遍历l1及l2,取最小的作为cursor.next,同时该链表前进一个节点,并且cursor跟着前进;最后再将cursor.next指向尚未遍历完的链表的剩余节点...;之后返回头指针指向的节点 小结 合并两个有序链表的基本思路就是设置一个cursor以及新链表的头指针,然后同时遍历两个链表,取小的节点作为cursor的next,然后该链表往前进,cursor也跟着往前进...,最后再将cursor.next指向尚未遍历完的链表的剩余节点 doc he-bing-liang-ge-pai-xu-de-lian-biao-lcof

    65200

    合并两个排序的单链表

    1 问题 关于链表的合并,常见的类型有两种: 直接合并,没有什么规则: 将多个链表头尾相连合并成一个链表 有序链表合并成有序链表: 两个有序链表合并成一个有序链表。...这里我们将要解决的问题是有序列表的合并,在上课的时候我们学习了如何直接合并两个单链表,那么如果在合并的同时还要注意顺序问题的话该如何解决呢?本篇周博客将讨论此问题。...2 方法 (1)判断空链表的情况,只要有一个链表为空,那答案必定就是另一个链表了,就算另一个链表也为空。 (2)新建一个空的表头后面连接两个链表排序后的节点,两个指针分别指向两链表头。...(4)遍历到最后肯定有一个链表还有剩余的节点,它们的值将大于前面所有的,直接连在新的链表后面即可通过实验、实践等证明提出的方法是有效的,是能够解决开头提出的问题。...,直接连在后面 if pHead1: cur.next = pHead1 else: cur.next = pHead2 #返回值去掉表头 # return head.next 3 结语 我们针对排序单链表的合并问题

    10710

    leetcode链表之合并两个排序的链表

    序 本文主要记录一下leetcode链表之合并两个排序的链表 题目 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。...{ cursor.next = l1; } return newHead.next; } } 这里先创建一个newHead节点来表示合并后链表的头指针...,然后创建一个cursor,其初始值为newHead;之后同时遍历l1及l2,取最小的作为cursor.next,同时该链表前进一个节点,并且cursor跟着前进;最后再将cursor.next指向尚未遍历完的链表的剩余节点...;之后返回头指针指向的节点 小结 合并两个有序链表的基本思路就是设置一个cursor以及新链表的头指针,然后同时遍历两个链表,取小的节点作为cursor的next,然后该链表往前进,cursor也跟着往前进...,最后再将cursor.next指向尚未遍历完的链表的剩余节点 doc he-bing-liang-ge-pai-xu-de-lian-biao-lcof

    46720

    LeetCode004|合并两个排序的链表

    0x01,题目简述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。...0x02,示例 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 0x03,题解思路 循环判断两个链表是否为空,若其中一个为空,则直接返回另外一个链表,因为题意链表元素的大小是有序的...,使用一个哨兵节点进行数据的接收,当其中一个链表为空,退出循环,有可能循环退出之后,其中一个链表的还有剩余元素没有挂载在链表后面,所以最后后面要重新进行判断一下。...0x04,题解程序 0x05,总结 这周就没怎么去写关于技术文的文章了,一个是觉得适度放松和写作对自己有好处,没有必要将自己处于一个非常忙碌的状态,今天写的这篇文章主要还两个链表的操作,其实抛开链表的前后节点直接的连接关系...,链表就是数组的一个体现,以前的我是一个处于很忙碌的状态,从早忙到晚,最近看了一些文章和一些受启发的短视频慢慢调整了自己的状态,或许最大的就是自己心态的调整,因为上学时心心念想要学习但一直未学习的内容终于在这段时间内完成了

    31630

    剑指Offer-合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。...思路 思路一(迭代): 首先处理空链表,当其中一个为空链表时,直接输出另一个;当两个均为空链表时,输出null。 初始化两个链表头,其中一个表头用以记录两个链表比较后的结果,另一个用来返回结果。...循环,如果两个链表不为空,进行比较,并将值小的赋给合并的链表头cur,值小的链表向后移动一位,合并链表cur向后移动一位。 如果两个链表有一为空,循环结束,把未结束的链表直接连接到合并链表的尾部。...比较 list1 和 list2 的头结点,较小的头结点作为合并后新链表的头结点 确定新链表的头结点之后,就可以递归比较余下的结点了 代码实现 package LinkedList; /** * 合并两个排序的链表...* 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

    55440

    剑指offer - 合并两个排序的链表 - JavaScript

    题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。...题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 解法:迭代 设置一个“哨兵节点”叫 preHead,这会让代码写起来非常“清爽”。...整体流程如下: 如果 pHead1 和 pHead2,均没遍历完: 如果 pHead1.val 的 next 指向 pHead1。...否则,当前 node 的 next 指向 pHead2,移动 pHead2 指针。...移动 node 指针 继续循环 否则,结束循环: 如果 pHead1 未遍历完,node 的 next 指向 pHead1 如果 pHead2 未遍历玩,node 的 next 指向 pHead2 时间复杂度是

    60610
    领券