合并两个排序的链表——17-创新互联

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

10余年的滴道网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站建设的优势是能够根据用户设备显示端的尺寸不同,自动调整滴道建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“滴道网站设计”,“滴道网站推广”以来,每个客户项目都认真落实执行。

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

程序设计如下:

#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

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

《完》

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


分享标题:合并两个排序的链表——17-创新互联
文章来源:http://azwzsj.com/article/dsjgch.html