如何将两个有序链表合并成一个有序链表。

有两个带头节点的有序链表,如何把他们合成一个有序链表?(假设链表带头节点)

我们通过取出其中一条链表的头节点作为合成后的有序链表的头节点(当然,这里也可以自己重新生成一个节点来作为头节点,但是使用原先的可以节省开销)。

取出后,这既是新链表的head,也是它的tail,因为新链表现在只有这么一个节点,我们用tail标记一下它。

接下去,我们去比较两条链表的数值,取较小值的节点追加到新的链表的尾部。

struct Node
{
    int data;
    Node* next;
};

void Merge(Node* list1, Node* list2)
{
    Node *p, *q, *r, *tail;
    p = list1->next;
    q = list2->next;
    tail = list1;
    tail->next = NULL;
    while(p != NULL && q != NULL) {
        if (p->data < q->data) {
            r = p;
            p = p->next;
        } else {
            r = q;
            q = q->next;
        }
        r->next = tail->next;
        tail->next = r;
        tail = r;
    }
    if (p) tail->next = p;
    if (q) tail->next = q;
    list2->next = NULL;
}

对上面的代码作下稍微的解释:

    p = list1->next;
    q = list2->next;
    tail = list1;
    tail->next = NULL;
使p,q分别指向两条链表的第一个数据节点。

把list1的头节点取出来作为新链表的头节点,同时标记为tail,由于此时只有一个头节点,所以next为NULL。


    while(p != NULL && q != NULL) {
        if (p->data < q->data) {
            r = p;
            p = p->next;
        } else {
            r = q;
            q = q->next;
        }
        r->next = tail->next;
        tail->next = r;
        tail = r;
    }

比较两条链表各个节点的数据大小,取得较小的节点r,并把r追加到链表的尾部,同时tail指针指向尾部的r,循环直到其中一条链表结束。


    if (p) tail->next = p;
    if (q) tail->next = q;
    list2->next = NULL;

退出循环后,把还没有检测到尾部的链表追加到新链表的尾部。

list2->next赋值NULL,防止指针悬空。

(这里可能会有人说,新生成的链表的节点不是还在吗?这里不可能悬空哈!考虑下,万一通过list1把对应的节点释放掉了呢,安全问题很重要)




  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值