リンクリストに関する古典的なOJの質問

テーブルポット、私は出ています!

ポットを見て、セットを見て、死ぬのを見て、美人を見て、ジンティアンがダカルマに何をもたらしたかを見てください。

------------さて、Jintianは、リンクリストに関する3つの古典的なOJの質問をあなたにもたらしました!(はははははは)


1.単一リンクリストを逆にします:https://leetcode-cn.com/problems/reverse-linked-list/

2.リンクリストの中央ノード:https://leetcode-cn.com/problems/middle-of-the-linked-list/

3. 2つの順序付きリストをマージします:https://leetcode-cn.com/problems/merge-two-sorted-lists/

注:これらの質問はすべてLikouからのものです。リンクをコピーして、質問に直接回答することができます。


 次に、今日の勉強に入りましょう!


1.単一リンクリストを逆にします。リンクリストを逆にして、逆リンクリストを返します。

例:

 アイデア1:

 質問1:n3 == NULLがループを停止しないのはなぜですか?

 質問2:リンクリストが空の場合

回答:リンクリストが空の場合は、NULLを直接返します

注:繰り返されるプロセスは通常、ループで解決されます

ループの3つの要素:初期値、反復プロセス、終了条件

アイデアコードの実装:

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


struct ListNode* reverseList(struct ListNode* head){
    if(head==NULL)
    return NULL;
    //初始化
    struct ListNode* n1 = NULL,*n2 = head,*n3 = n2->next;
    //结束条件
    while(n2)
    {
        //迭代过程(重复过程)
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if(n3)
        n3 = n3->next;
    }
    return n1;
}

​

アイデア2:頭の挿入方法

 アイデア2コードの実装:

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


struct ListNode* reverseList(struct ListNode* head){
    if(head==NULL)
    {
        return NULL;
    }
   struct ListNode *cur = head,*next = cur->next;
   struct ListNode* newhead = NULL;
   while(cur)
   {
       cur->next = newhead;
       newhead = cur;
       cur = next;
       if(next)
       next = next->next;
   }
   return newhead;
}

2.リンクリストの中間ノード:

ヘッドノードがheadである空でない単一リンクリストが与えられた場合、リンクリストの中央ノードを返します。

中間ノードが2つある場合は、2番目の中間ノードを返します。

例1:入力[1,2,3,4,5]出力:3

例2:入力[3,4,5,6]出力:5

アイデア:

 上記の考えから、これも反復プロセスであることがわかります。初期条件は低速で、高速は最初のノードを指します。反復プロセスでは、低速は1ステップ、高速は2ステップ、終了条件は高速です。 -> next、fast1つが空である限り終了します。

コード:

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


struct ListNode* middleNode(struct ListNode* head){
    struct ListNode *slow = head,*fast = head;
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}

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

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


struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
    if(list1==NULL)
    {
        return list2; 
    }
    if(list2==NULL)
    {
        return list1;
    }
    struct ListNode *head = NULL,*tail = NULL;
    while(list1 != NULL && list2 != NULL)
    {
        if(list1->val < list2->val)
        {
            if(tail == NULL)
            {
                head = tail = list1;
            }
            else
            {
                tail->next = list1;
                tail = tail->next;
            }
            list1=list1->next;
        }
        else
        {
            if(tail == NULL)
            {
                head = tail = list2;
            }
            else
            {
                tail->next = list2;
                tail=tail->next;
            }
            list2=list2->next;
        }
    }
    if(list1)
    {
        tail->next = list1;
    }
    if(list2)
    {
        tail->next = list2;
    }

    return head;
}

 時計ポット、時計セット、時計ダイ、時計美女が今日ここにいます!

QQ:2186529582ご不明 な点がございまし
たら、お気軽に追加してください。

おすすめ

転載: blog.csdn.net/m0_66488562/article/details/123510351