合并两个单向链表

来源:互联网 发布:77pepecom现在域名 编辑:程序博客网 时间:2024/05/30 05:12

问题一:现在有链表A和链表B,都已经升序排列,将A和B合并后也按升序排列。

算法思路一:在链表A中分别取出每个结点,再分别与链表B中的结点进行比较,找到适当位置后插入。这种算法时间复杂度太高,假如链表A和;链表B的长度分别是m和n,那么复杂度就是O(m*n)。

算法思路二:链表A和链表B分别有两个指向当前结点的指针pAHead和pAHead,每次比较当前的这两个结点,谁小就把谁假如到第三个新链表中,然后小的这个链表的指针继续后移,最坏的时间复杂度是O(m+n)。

下面这个算法是针对思路二的解法,接下来会给出两个非有序排列的链表进行排序的算法。今天先到这里,连着几天熬夜码代码有点扛不住~晚安各位加油~



图1.合并前合并后


图2.合并过程

struct ListNode {    int m_value;    struct ListNode * m_pNext;};
//打印链表void printdata(struct ListNode * p) {    while (p!= NULL) {        printf("%d",p->m_value);        p = p->m_pNext;    }    printf("\n");}
//创建链表struct ListNode * creatListNode(int n){    struct ListNode * pHead = malloc(sizeof(struct ListNode));    struct ListNode * tempNode  = pHead;    for (int i = 1; i<=n; i++) {        struct ListNode * p = malloc(sizeof(struct ListNode));        p->m_value = i;        tempNode ->m_pNext = p;        tempNode = p;    }    tempNode->m_pNext = NULL;    return pHead;}
//合并链表struct ListNode * Merge(struct ListNode * pAHead,struct ListNode * PBHead){    if (pAHead == NULL) {        return PBHead;    }    if (PBHead == NULL) {        return pAHead;    }    struct ListNode * pMergeHead = NULL;        if (pAHead->m_value<PBHead->m_value) {        pMergeHead = pAHead;        pMergeHead->m_pNext = Merge(pAHead->m_pNext, PBHead);    } else {        pMergeHead = PBHead;        pMergeHead->m_pNext = Merge(pAHead, PBHead->m_pNext);    }    return pMergeHead;}
//主函数调用int main(int argc, const char * argv[]) {    // insert code here...    struct ListNode * pAhead = creatListNode(5);    printdata(pAhead);    struct ListNode * pBhead = creatListNode(5);    printdata(pBhead);    struct ListNode * pMergeHead = Merge(pAhead, pBhead);    printdata(pMergeHead);    return 0;}


0 0
原创粉丝点击