21xrx.com
2024-12-22 23:51:46 Sunday
登录
文章检索 我的文章 写文章
C++实现有序链表合并
2023-06-30 20:13:10 深夜i     --     --
C++ 有序链表 合并

有序链表是指链表中的元素按照从小到大的顺序排列。在实际开发中,经常需要将两个有序链表合并成一个有序链表。如果使用C++语言实现有序链表合并,有以下两种方法:

1.迭代法

迭代法是比较直观的合并方法,具体实现思路如下:

首先创建一个新的链表,并定义两个指针分别指向要合并的两个有序链表的头节点。

比较两个有序链表的当前节点,将较小的节点加入到新链表中,并将指向较小节点的指针向后移动一个位置。

重复以上步骤,直到其中一个链表为空,将另一个链表的剩余节点直接加入到新链表的尾部。

最后返回新链表的头节点。

代码实现如下:

Node* merge(Node* head1, Node* head2) {

  if (head1 == nullptr)

    return head2;

  if (head2 == nullptr)

    return head1;

  Node* dummy = new Node(0);

  Node* cur = dummy;

  while (head1 != nullptr && head2 != nullptr) {

    if (head1->val <= head2->val)

      cur->next = head1;

      head1 = head1->next;

     else

      cur->next = head2;

      head2 = head2->next;

    cur = cur->next;

  }

  if (head1 == nullptr)

    cur->next = head2;

   else

    cur->next = head1;

  return dummy->next;

}

2.递归法

递归法实现起来比较简洁,具体实现思路如下:

首先判断两个链表是否为空,如果有一个为空,则直接将另一个链表返回。

比较链表头节点的大小,将较小的头节点加入到新链表中。

将较小节点的next指针指向递归合并后的子链表。

最后返回新链表的头节点。

代码实现如下:

Node* merge(Node* head1, Node* head2) {

  if (head1 == nullptr)

    return head2;

  if (head2 == nullptr)

    return head1;

  if (head1->val <= head2->val) {

    head1->next = merge(head1->next, head2);

    return head1;

  } else {

    head2->next = merge(head1, head2->next);

    return head2;

  }

}

无论是迭代法还是递归法,都需要保证输入的两个链表都是有序链表。在实际使用中,建议使用递归法,因为代码量较少,且易于理解。但是如果数据量较大,迭代法会更快一些,因为递归法会创建大量的栈空间。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复