91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

合并兩個排序的鏈表——17

發布時間:2020-07-11 14:02:09 來源:網絡 閱讀:300 作者:給我個bit位 欄目:編程語言

    輸入兩個遞增排序的鏈表,合并這兩個鏈表并使新鏈表中的結點仍然是按照遞增排序的。


    要合并兩個遞增的鏈表,首先找出兩個鏈表的頭結點中較小的一個就為合并后新鏈表的頭結點,之后再依次將兩個鏈表中的結點值進行相比較,依次將較小值在新鏈表中進行尾插,直到其中一個鏈表遍歷完成,將剩余鏈表直接鏈在新鏈表的尾部就可以了,因為鏈表本來就是有序遞增的;


程序設計如下:

#include <iostream>
#include <assert.h>
using namespace std;
  
template <class T>
struct ListNode//鏈表結點結構
{
    T _data;
    ListNode<T>* _next;
};
  
template <class T>
ListNode<T>* buy_node(T data)//創建一個鏈表結點
{
    ListNode<T>* tmp = new ListNode<T>;
    tmp->_data = data;
    tmp->_next = NULL;
    return tmp;
}
  
template <class T>
void init_list(ListNode<T>** node, T data)//初始化鏈表
{
    *node = buy_node(data);
}
  
template <class T>
void push_node(ListNode<T>*& head, T data)//插入鏈表結點
{
    if(head == NULL)
    {   
        init_list(&head, data);
        return;
    }   
    ListNode<T>* tmp = head;
    while(tmp->_next != NULL)
    {
        tmp = tmp->_next;
    }
    tmp->_next = buy_node(data);
}
  
template <class T>
void print_list(ListNode<T>* head)//打印鏈表
{
    while(head != NULL)
    {
        cout<<head->_data<<"->";
        head = head->_next;
    }
    cout<<"NULL"<<endl;
}
  
template <class T>
void destroy_list(ListNode<T>*& head)//銷毀鏈表
{
    if(head != NULL)
    {
        ListNode<T>* cur = head;
        ListNode<T>* tmp = head;
        while(cur != NULL)
        {
            tmp = cur;
            cur = cur->_next;
            delete tmp;
        }
        head = NULL;
    }
}

//實現1:循環
template <class T>
ListNode<T>* MergeList(ListNode<T>* list1, ListNode<T>* list2)
{
    if(list1 == NULL)//條件判斷
        return list2;
    else if(list2 == NULL)
        return list1;

    ListNode<T>* newHead = NULL;

    ListNode<T>* tmp1 = NULL;
    ListNode<T>* tmp2 = NULL;

    if(list1->_data <= list2->_data)//決定新鏈表的頭結點
    {
        newHead = list1;
        tmp1 = list1->_next;
        tmp2 = list2;
    }
    else
    {
        newHead = list2;
        tmp1 = list1;
        tmp2 = list2->_next;
    }

    ListNode<T>* 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 <class T>
ListNode<T>* MergeList(ListNode<T>* list1, ListNode<T>* list2)
{
    if(list1 == NULL)//條件判斷
        return list2;
    else if(list2 == NULL)
        return list1;

    ListNode<T>* 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<int>* 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<int>* 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<int>* newhead = MergeList(list1, list2);
    cout<<"merge list:";
    print_list(newhead);

    destroy_list(list1);
    destroy_list(list2);

    return 0;
}


運行程序:

合并兩個排序的鏈表——17


從上面程序可以看出來,用遞歸比循環看起來更好理解和簡潔。



《完》

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石台县| 海兴县| 葵青区| 大化| 三穗县| 靖边县| 镇远县| 五家渠市| 麻栗坡县| 岳阳县| 岱山县| 定西市| 永新县| 榆林市| 康平县| 米林县| 含山县| 盐亭县| 太原市| 聊城市| 吐鲁番市| 本溪| 平陆县| 鹤壁市| 乐亭县| 五台县| 嘉兴市| 夏邑县| 大庆市| 黄山市| 新乡市| 屏边| 麻江县| 舞钢市| 五大连池市| 曲靖市| 新津县| 广德县| 疏附县| 泾阳县| 庄河市|