テーブルポット、私は出ています!!!
ポットを見て、セットを見て、死ぬのを見て、美人を見て、ジンティアンがダカルマに何をもたらしたかを見てください。??
------------さて、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;
}
時計ポット、時計セット、時計ダイ、時計美女が今日ここにいます!!!