美文网首页
合并两个有序链表

合并两个有序链表

作者: krislyy_ | 来源:发表于2018-11-02 22:21 被阅读0次

算法(algorithm)

归并排序的最后一个步骤, 将两个有序的链表合并成一个有序链表。从每个链表中取出一个元素然后比较,之后插入新的合并链表,依次递归。

#include <iostream>

typedef struct Node {
    int v;
    Node *next;
}Node;

Node* createNode(int v){
    Node* node = new Node();
    node->v = v;
    node->next = nullptr;
    return node;
}

void addNode(Node** pRoot, int v){
    Node* pHeader = nullptr;
    if (!(pHeader = *pRoot))
    {
        pHeader = *pRoot = createNode(v);
        return;
    }

    while (pHeader->next != nullptr)
    {
        pHeader = pHeader->next;
    }
    pHeader->next = createNode(v);
}

void printList(Node** pRoot) {
    Node* pHeader = *pRoot;
    while (pHeader != nullptr)
    {
        std::cout << pHeader->v;
        pHeader = pHeader->next;
        if (pHeader != nullptr){
            std::cout << "->";
        }
    }
    std::cout << "\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" << std::endl;
}

Node* mergeList(Node *pNode1, Node* pNode2) {
    if (pNode1 == nullptr)
    {
        return pNode2;
    }
    else if (pNode2 == nullptr)
    {
        return pNode1;
    }

    Node* pMergeList = nullptr;
    if (pNode1->v < pNode2->v)
    {
        pMergeList = pNode1;
        pMergeList->next = mergeList(pNode1->next, pNode2);
    }
    else
    {
        pMergeList = pNode2;
        pMergeList->next = mergeList(pNode1, pNode2->next);
    }
    return pMergeList;
    //非递归实现
    /*
     ListNode new_node(0);
      ListNode* ptr= &new_node;
        
        while(l1 && l2){
            if(l1->val < l2->val){
                ptr->next=l1;
                l1=l1->next;
            }else{
                ptr->next=l2;
                l2=l2->next;
            }
            ptr=ptr->next;
        }
        
        if(l1){
            ptr->next=l1;
        }
        if(l2){
            ptr->next=l2;
        }
        return new_node.next;
   */

}

void destroyList(Node** pRoot){
    Node* pHeader = *pRoot;
    while(pHeader != nullptr)
    {
        Node* pTemp = pHeader;
        pHeader = pHeader->next;
        std::cout << "delete " << pTemp->v << std::endl;
        delete pTemp;
    }
}

int main()
{
    Node* pNode1 = nullptr;
    addNode(&pNode1, 3);
    addNode(&pNode1, 5);
    addNode(&pNode1, 6);
    addNode(&pNode1, 9);
    addNode(&pNode1, 12);
    addNode(&pNode1, 15);
    printList(&pNode1);

    Node* pNode2 = nullptr;
    addNode(&pNode2, 1);
    addNode(&pNode2, 5);
    addNode(&pNode2, 8);
    addNode(&pNode2, 10);
    addNode(&pNode2, 11);
    printList(&pNode2);

    Node* mergeNode = mergeList(pNode1, pNode2);
    printList(&mergeNode);
    destroyList(&mergeNode);

    getchar();
    return 0;
}

相关文章

  • leecode刷题(23)-- 合并两个有序链表

    leecode刷题(23)-- 合并两个有序链表 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回。新...

  • 合并单链表

    合并两个有序链表非递归实现 合并两个有序链表递归实现

  • leetcode 链表 [C语言]

    21. 合并两个有序链表 合并两个有序链表 61. 旋转链表 (快慢指针) 61. 旋转链表 相关标签 : 链表 ...

  • ARTS-Week6 有序链表合并、DevOps、Json解析、

    Algorithm LeetCode原题链接: 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回。新链...

  • 2018-12-26

    问题列表 合并两个有序链表 合并K个排序链表 合并区间 插入区间 问题与反馈 总结与收获 多个有序链表的合并,类似...

  • leetcode的题目21

    合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示...

  • Swift 合并两个有序链表 - LeetCode

    题目: 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组...

  • LeetCode 21. 合并两个有序链表

    21. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成...

  • 刷leetCode算法题+解析(四)

    合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示...

  • Swift - LeetCode - 合并两个有序链表

    题目 合并两个有序链表 问题: 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节...

网友评论

      本文标题:合并两个有序链表

      本文链接:https://www.haomeiwen.com/subject/vydhxqtx.html