21xrx.com
2024-12-22 20:52:22 Sunday
登录
文章检索 我的文章 写文章
C++实现有序链表序列合并(PTA练习题)
2023-07-05 10:10:30 深夜i     --     --
C++ 有序链表 序列合并 PTA练习题

C++实现有序链表序列合并是一道PTA练习题。在实现这个问题之前,我们需要先了解什么是有序链表。

有序链表是一种链表,其中节点按照某种特定的顺序排列。通常情况下,有序链表是按照节点键值进行排序的。在有序链表中,插入、删除和查找操作都可以在O(n log n)的时间复杂度内完成。

现在我们考虑如何实现有序链表序列合并。假设有两个有序链表A和B,现在需要将它们合并成一个有序链表C。根据有序链表的性质,我们可以使用归并排序的思路来实现合并操作。

具体地,我们可以从链表A和B的头节点开始,比较它们的键值大小,将较小的节点连接到链表C的尾部。然后,将较小节点所在链表的指针向后移动一个位置,继续比较节点大小。如此反复,直到其中一个链表遍历完成。此时,将另一个链表剩余的节点全部连接到链表C的尾部即可。

下面是C++实现代码:


#include <iostream>

using namespace std;

struct ListNode {

  int val;

  ListNode* next;

  ListNode(int x) : val(x), next(NULL) {}

};

ListNode* merge(ListNode* A, ListNode* B) {

  if (!A) return B;

  if (!B) return A;

  ListNode* C = new ListNode(0);

  ListNode* tail = C;

  while (A && B) {

    if (A->val < B->val)

      tail->next = A;

      A = A->next;

     else

      tail->next = B;

      B = B->next;

    

    tail = tail->next;

  }

  if (!A) tail->next = B;

  else tail->next = A;

  return C->next;

}

int main() {

  ListNode* A = new ListNode(1);

  A->next = new ListNode(3);

  A->next->next = new ListNode(5);

  A->next->next->next = new ListNode(7);

  ListNode* B = new ListNode(2);

  B->next = new ListNode(4);

  B->next->next = new ListNode(6);

  B->next->next->next = new ListNode(8);

  ListNode* C = merge(A, B);

  while (C)

    cout << C->val << " ";

    C = C->next;

  

  return 0;

}

在这段代码中,我们定义了一个ListNode结构体,表示链表节点。其中val表示节点键值,next表示下一个节点的指针。我们还定义了一个merge函数,表示将两个有序链表合并成一个新链表,并返回新链表的头节点指针。在main函数中,我们定义两个有序链表A和B,将它们传入merge函数得到合并后的链表C,并遍历输出所有节点的键值。

通过这个简单的例子,我们可以看到有序链表序列合并的过程非常简单,只需要从头开始比较大小,然后不断将较小节点连接到新链表尾部即可。此外,由于有序链表的性质,时间复杂度可以做到O(n),非常高效。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复
    相似文章