ホームページ  >  記事  >  バックエンド開発  >  C言語で2つの順序付きリンクリストをマージする方法

C言語で2つの順序付きリンクリストをマージする方法

王林
王林オリジナル
2020-10-29 11:35:436726ブラウズ

C 言語で 2 つの順序付きリンク リストをマージする方法: 指定した 2 つの順序付きリンク リストのすべてのノードを結合するだけです。たとえば、2 つの順序付きリンク リストは [1->2->4] と [1->3->4] で、マージされた順序付きリンク リストは [1->1->2] です。 - > 3 - > 4 - > 4]。

C言語で2つの順序付きリンクリストをマージする方法

具体的な方法:

2 つの順序付きリンク リストを新しい順序付きリンク リストにマージして戻ります。新しいリンク リストは、指定された 2 つのリンク リストのすべてのノードを連結することによって形成されます。

(ビデオチュートリアルの推奨: java コース)

入力:

1->2->4, 1->3->4

出力:

1->1->2->3->4->4

分析: 2 つのリンクされたリストは順序付きリンク リストなので、2 つのリンク リストを順番にたどってサイズを比較するだけです。

コードの実装:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
    if(l1==NULL){
        return l2;
    }
    if(l2==NULL){
        return l1;
    }
    struct ListNode *l = (struct ListNode*)malloc(sizeof(struct ListNode));
    l->next = NULL;
    struct ListNode *list1 = l1;
    struct ListNode *list2 = l2;
    if(l1->val<l2->val){
        l->val=l1->val;
        if(list1->next==NULL){
            l->next=list2;
            return l;
        }
        list1=list1->next;
    }else{
        l->val=l2->val;
        if(list2->next==NULL){
            l->next=list1;
            return l;
        }
        list2=list2->next;
    }
    struct ListNode *list = l;
    while(list1->next!=NULL&&list2->next!=NULL){
        if(list1->val<=list2->val){
            struct ListNode *body = (struct ListNode *)malloc(sizeof(struct ListNode));
            body->val = list1->val;
            body->next = NULL;
            list->next = body;
            list = list->next;
            list1 = list1->next;
        }else{
            struct ListNode *body = (struct ListNode*)malloc(sizeof(struct ListNode));
            body->val=list2->val;
            body->next=NULL;
            list->next=body;
            list=list->next;
            list2=list2->next;
        }
    }
    if(list1->next==NULL){
        while(list2->next!=NULL){
            if(list1->val<=list2->val){
                list->next = list1;
                list = list->next;
                list->next=list2;
                return l;
            }else{
                struct ListNode *body = (struct ListNode*)malloc(sizeof(struct ListNode));
                body->val=list2->val;
                body->next=NULL;
                list->next=body;
                list=list->next;
                list2=list2->next;
            }
        }
    }else{
        while(list1->next!=NULL){
            if(list2->val<=list1->val){
                list->next=list2;
                list=list->next;
                list->next=list1;
                return l;
            }else{
                struct ListNode *body = (struct ListNode*)malloc(sizeof(struct ListNode));
                body->val=list1->val;
                body->next=NULL;
                list->next=body;
                list=list->next;
                list1=list1->next;
            }
        }
    }
    if(list1->next==NULL&&list2->next==NULL){
        if(list1->val<=list2->val){
            list->next = list1;
            list=list->next;
            list->next=list2;
        }else{
            list->next=list2;
            list=list->next;
            list->next=list1;
        }
    }



    return l;
}

グラフィック チュートリアルの共有: Java の概要

以上がC言語で2つの順序付きリンクリストをマージする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。