返回

链表的合并实战指南:理论与应用!

前端


了解合并数组或链表是如何运作的,有助于您轻松解决其他复杂的操作,如合并多个有序列表、去重或排序。因此,本文旨在为您提供详细的链表合并指南。

理论基础:

  • 链表:一种以指针连接各个元素的线性数据结构,每个元素都有一个值和一个指向下一个元素的指针。
  • 合并:将两个有序链表中的元素组合成一个新的有序链表。
  • 合并算法:
    1. 创建一个新的空链表作为结果链表。
    2. 比较两个链表的第一个元素,将较小的元素添加到结果链表中。
    3. 将较大的元素与剩余的较小元素链表进行同样的比较和合并。
    4. 重复步骤2和3,直到两个链表都为空。

实战步骤:

  1. 创建两个链表:
class Node:
  def __init__(self, value):
    self.value = value
    self.next = None

class LinkedList:
  def __init__(self):
    self.head = None

# 创建两个链表
list1 = LinkedList()
list2 = LinkedList()

# 将值添加到链表中
list1.append(1)
list1.append(2)
list1.append(4)

list2.append(1)
list2.append(3)
list2.append(4)
  1. 创建合并后的链表:
def merge_linked_lists(head1, head2):
  # 创建新的空链表作为结果链表
  result = LinkedList()

  # 比较两个链表的第一个元素
  while head1 and head2:
    if head1.value < head2.value:
      result.append(head1.value)
      head1 = head1.next
    else:
      result.append(head2.value)
      head2 = head2.next

  # 将剩余的元素添加到结果链表中
  while head1:
    result.append(head1.value)
    head1 = head1.next
  while head2:
    result.append(head2.value)
    head2 = head2.next

  # 返回结果链表
  return result
  1. 输出合并后的链表:
# 输出合并后的链表
result_list = merge_linked_lists(list1.head, list2.head)
result_list.print()

应用实例:

  1. 合并多个有序链表:
def merge_multiple_linked_lists(lists):
  # 创建新的空链表作为结果链表
  result = LinkedList()

  # 遍历每个链表
  for head in lists:
    # 将当前链表与结果链表进行合并
    result = merge_linked_lists(result.head, head)

  # 返回结果链表
  return result
  1. 去重:
def remove_duplicates(head):
  # 创建新的空链表作为结果链表
  result = LinkedList()

  # 创建一个集合来存储已经出现的元素
  seen = set()

  # 遍历链表
  while head:
    # 如果元素不在集合中,则将其添加到结果链表和集合中
    if head.value not in seen:
      result.append(head.value)
      seen.add(head.value)
    # 移动到下一个元素
    head = head.next

  # 返回结果链表
  return result
  1. 排序:
def sort_linked_list(head):
  # 创建新的空链表作为结果链表
  result = LinkedList()

  # 将链表中的元素添加到集合中
  values = set()
  while head:
    values.add(head.value)
    head = head.next

  # 将集合中的元素按顺序添加到结果链表中
  for value in sorted(values):
    result.append(value)

  # 返回结果链表
  return result