成都网站建设设计

将想法与焦点和您一起共享

合并两个排序的链表——17

    输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。

成都创新互联是一家专注于成都网站设计、成都做网站、外贸网站建设与策划设计,民权网站建设哪家好?成都创新互联做网站,专注于网站建设十余年,网设计领域的专业建站公司;建站业务涵盖:民权等地区。民权做网站价格咨询:18980820575

    要合并两个递增的链表,首先找出两个链表的头结点中较小的一个就为合并后新链表的头结点,之后再依次将两个链表中的结点值进行相比较,依次将较小值在新链表中进行尾插,直到其中一个链表遍历完成,将剩余链表直接链在新链表的尾部就可以了,因为链表本来就是有序递增的;

程序设计如下:

#include 
#include 
using namespace std;
  
template 
struct ListNode//链表结点结构
{
    T _data;
    ListNode* _next;
};
  
template 
ListNode* buy_node(T data)//创建一个链表结点
{
    ListNode* tmp = new ListNode;
    tmp->_data = data;
    tmp->_next = NULL;
    return tmp;
}
  
template 
void init_list(ListNode** node, T data)//初始化链表
{
    *node = buy_node(data);
}
  
template 
void push_node(ListNode*& head, T data)//插入链表结点
{
    if(head == NULL)
    {   
        init_list(&head, data);
        return;
    }   
    ListNode* tmp = head;
    while(tmp->_next != NULL)
    {
        tmp = tmp->_next;
    }
    tmp->_next = buy_node(data);
}
  
template 
void print_list(ListNode* head)//打印链表
{
    while(head != NULL)
    {
        cout<_data<<"->";
        head = head->_next;
    }
    cout<<"NULL"<
void destroy_list(ListNode*& head)//销毁链表
{
    if(head != NULL)
    {
        ListNode* cur = head;
        ListNode* tmp = head;
        while(cur != NULL)
        {
            tmp = cur;
            cur = cur->_next;
            delete tmp;
        }
        head = NULL;
    }
}

//实现1:循环
template 
ListNode* MergeList(ListNode* list1, ListNode* list2)
{
    if(list1 == NULL)//条件判断
        return list2;
    else if(list2 == NULL)
        return list1;

    ListNode* newHead = NULL;

    ListNode* tmp1 = NULL;
    ListNode* tmp2 = NULL;

    if(list1->_data <= list2->_data)//决定新链表的头结点
    {
        newHead = list1;
        tmp1 = list1->_next;
        tmp2 = list2;
    }
    else
    {
        newHead = list2;
        tmp1 = list1;
        tmp2 = list2->_next;
    }

    ListNode* cur = newHead;

    while((tmp1 != NULL) && (tmp2 != NULL))
    {
        if(tmp1->_data <= tmp2->_data)//将较小值进行尾插
        {
            cur->_next = tmp1;
            cur = cur->_next;
            tmp1 = tmp1->_next;
        }
        else
        {
            cur->_next = tmp2;
            cur = cur->_next;
            tmp2 = tmp2->_next;
        }
    }

    if(tmp1 == NULL)//将剩下的链表直接接在新链表后面
        cur->_next = tmp2;
    else
        cur->_next = tmp1;

    return newHead;
}

//实现2:递归
template 
ListNode* MergeList(ListNode* list1, ListNode* list2)
{
    if(list1 == NULL)//条件判断
        return list2;
    else if(list2 == NULL)
        return list1;

    ListNode* newHead = NULL;

    if(list1->_data <= list2->_data)
    {
        newHead = list1;
        newHead->_next = MergeList(list1->_next, list2);
    }
    else
    {
        newHead = list2;
        newHead->_next = MergeList(list1, list2->_next);
    }
    return newHead;
}

int main()
{
    ListNode* list1 = NULL;
    push_node(list1, 1);
    push_node(list1, 2);
    push_node(list1, 3);
    push_node(list1, 8);
    push_node(list1, 11);
    push_node(list1, 14);

    ListNode* list2 = NULL;
    push_node(list2, 5);
    push_node(list2, 6);
    push_node(list2, 7);
    push_node(list2, 8);
    push_node(list2, 9);

    cout<<"list1: ";
    print_list(list1);
    cout<<"list2: ";
    print_list(list2);
    
    ListNode* newhead = MergeList(list1, list2);
    cout<<"merge list:";
    print_list(newhead);

    destroy_list(list1);
    destroy_list(list2);

    return 0;
}

运行程序:

合并两个排序的链表——17

从上面程序可以看出来,用递归比循环看起来更好理解和简洁。

《完》


网站名称:合并两个排序的链表——17
链接分享:http://chengdu.cdxwcx.cn/article/gpphho.html