📌  相关文章
📜  合并两个没有重复的排序链表(1)

📅  最后修改于: 2023-12-03 15:07:28.011000             🧑  作者: Mango

合并两个没有重复的排序链表

介绍

在链表数据结构中,常常需要进行合并两个已排序的链表的操作。这可以在多个应用程序中使用,例如在归并排序的实现中。

这篇文章将讲解如何合并两个没有重复的已排序链表,以及如何用Python代码实现这个过程。 具体的,我们可以采用递归法和迭代法两种方法,本文将介绍这两种方法的实现过程。

递归法

首先我们来看递归法的实现过程。

递归法其实是比较直观的,我们只需要比较两个链表头的值的大小,然后递归地合并子链表即可。具体过程如下:

  1. 如果某一个链表为空,直接返回另一个链表
  2. 如果两个链表的头节点的值相等,那么任意返回一个并将另外一个作为参数递归即可。
  3. 如果链表1的头节点值小,那么将链表1的头节点与链表2合并,返回链表1。
  4. 如果链表2的头节点值小,那么将链表2的头节点与链表1合并,返回链表2。

下面是用Python代码实现的示例:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
    if not l1:
        return l2
    elif not l2:
        return l1

    if l1.val == l2.val:
        l1.next = self.mergeTwoLists(l1.next, l2)
        return l1
    elif l1.val < l2.val:
        l1.next = self.mergeTwoLists(l1.next, l2)
        return l1
    else:
        l2.next = self.mergeTwoLists(l1, l2.next)
        return l2
迭代法

迭代法也是非常常见的做法,他们的共同点其实都是比较链表每个节点的值,然后按照一定的顺序将他们整合到一起。

下面是迭代法合并两个链表的过程:

  1. 新建一个节点dummy,存最开始不需要的0值,
  2. 定义一个临时节点cur,它是我们的“指针”,他指向这个新链表的最后一位。
  3. 循环链表1和链表2,如果当前节点1小,cur的下一个指向链表1的节点并移动指针,否则cur的下一个指向链表2的节点并移动指针。
  4. 将剩下的节点全部加入新链表中。

下面是用Python代码实现的示例:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
    dummy = ListNode(0)
    cur = dummy

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

        cur = cur.next

    cur.next = l1 if l1 else l2

    return dummy.next
总结

本篇文章介绍了合并两个没有重复的已排序链表的两种方法:递归法和迭代法。递归法可以比较容易理解,而迭代法代码量较少,更易实现。无论采用哪种方法,最后的结果都是一致的。