LeetCode刷題(二) 鍊錶 棧和佇列

2021-10-08 07:47:50 字數 4356 閱讀 3647

1.merge-two-sorted-lists

class

solution

else

p=p-

>next;}if

(!l1) p-

>next=l2;if(

!l2) p-

>next=l1;

return head-

>next;}}

;

2.partiton-list

給出乙個鍊錶和乙個值x,以x為參照將鍊錶劃分成兩部分,使所有小於x的節點都位於大於或等於x的節點之前。兩個部分之內的節點之間要保持原始的相對順序。

例如:給出1->4->3->2->5->2和x = 3,

返回1->2->2->4->3->5.

**我自己的想法:**錯誤理解了題目的意思,這題就是將大於等於x的元素放在小於x的元素的後面,但是因為最後還加了一句,兩個部分之內的節點之間要保持原始的相對順序,以為是:4->2->1->3->5->2,輸出2->4->2->1->3->5,但其實是輸出:2->1->2->4->3->5。

class

solution

//第一種情況

if(p&&p-

>val==x)

listnode* ltx=p;

//找後半部分小於x的元素,尾插入到btx之後

listnode* temp;

while

(ltx-

>next&&btx!=p)

else

ltx=ltx-

>next;

}return head;

}else

else

temp=temp-

>next;

} ltx-

>next=btx_first-

>next;

return ltx_first-

>next;}}

};

leetcode上的想法:

class

solution

else

head=head-

>next;

}

after-

>next=

null

; before-

>next=after_head-

>next;

return before_head-

>next;}}

;

3.sort-list

== 在o(n log n)的時間內使用常數級空間複雜度對鍊錶進行排序。==

解題思路:

class

solution

else}if

(first) cur-

>next=first;

if(second) cur-

>next=second;

return res-

>next;

}//將鍊錶平分為兩段

listnode*

getmid

(listnode* head)

return slow;

}

listnode*

sortlist

(listnode* head)

};

4.reorder-list

將給定的單鏈表l: l 0→l 1→…→l n-1→l n,

重新排序為: l 0→l n →l 1→l n-1→l 2→l n-2→…

要求使用原地演算法,並且不改變節點的值

解題思路:先將鍊錶分為兩個子鍊錶,然後將第二個子鍊錶翻轉之後與前乙個子鍊錶間隔插入。

class

solution

return head;

}

listnode*

getmid

(listnode* head)

return slow;

}void

reorderlist

(listnode *head)

else

tag*=-

1;p=p-

>next;}if

(!first) p-

>next=second;if(

!second) p-

>next=first;}}

;

5.linked-list-circle

判斷給定的鍊錶中是否有環。擴充套件:你能給出不利用額外空間的解法麼?

解題思路:使用快慢指標,快指標fast每次移動2個節點,慢指標slow每次移動1個節點,如果快指標能夠追上慢指標,那就說明其中有乙個環,否則不存在環。

class

solution

return

false;}

};

6.linked-list-circle ii

== 對於乙個給定的鍊錶,返回環的入口節點,如果沒有環,返回null。拓展:你能給出不利用額外空間的解法麼?==

解題思路:當判斷完當前鍊錶有環之後,將兩指標分別放在煉表頭和相遇位置,並改為相同速度推進,則兩指標在環開始位置相遇。(可以推出,如將此時兩指標分別放在起始位置和相遇位置,並以相同速度前進,當乙個指標走完距離a時,另乙個指標恰好走出 繞環n-1圈加上c的距離。)

class

solutionif(

!fast||

!fast-

>next)

return

null

;

slow = head;

while

(slow != fast)

return slow;}}

;

7.copy-list-with-random-pointer

== 現在有乙個這樣的鍊錶:鍊錶的每乙個節點都附加了乙個隨機指標,隨機指標可能指向鍊錶中的任意乙個節點或者指向空。請對這個鍊錶進行深拷貝。==

解題思路:首先拷貝鍊錶中的結點和隨機指標(直接指向原煉表中的結點),然後將隨機指標指向的結點從原鍊錶分離到拷貝鍊錶,分離的時候要保證原鍊錶不被改變。

class

solution

//複製隨即指標

for(p=head;p;p=copy-

>next)

//將鍊錶拆分為兩個

for(p=head,head=p-

>next,copy=p-

>next;p;

)return head;}}

;

8.evaluate-reverse-polish-notation

計算逆波蘭式(字尾表示式)的值,運算子僅包含"+","-","*「和」/",被運算元可能是整數或其他表示式。

解題思路:

class

solution}if

(*it==

"-")}if

(*it==

"*")}if

(*it==

"/")}if

(*it!=

"+"&&

*it!=

"-"&&

*it!=

"*"&&

*it!=

"/")}if

(!s-

>

empty()

)return s-

>

top();

delete s;}}

;

9.palindrome-linked-list

請判斷乙個鍊錶是否為回文鍊錶。你能否用 o(n) 時間複雜度和 o(1) 空間複雜度解決此題?

== 記住整個鍊錶翻轉的過程==

listnode* tail=

nullptr

;while

(head)

class

solution

//翻轉後半部分的鍊錶

while

(slow)

while

(head&&second)

return

true;}

};

leetcode刷題 鍊錶篇

class solution return result class solution class solution return cura 注 思路 相交節點到尾部的節點數是一樣的,所以當cura遍歷到尾部時,再從headb開始遍歷,同當curb遍歷到尾部時,再從heada開始遍歷,他們指標相遇時...

Leetcode刷題鍊錶之環形鍊錶

給定乙個鍊錶,判斷鍊錶中是否有環。定義兩個指標,從頭節點開始,兩個指標都向右移動,但是設定他們的移動速度不一樣,如果為環形鍊錶,則指標肯定會相遇。若為直鏈表,兩個指標至少有乙個為空。definition for singly linked list.class listnode public cla...

Leetcode鍊錶刷題 pytho語言

為方便後續的使用查詢,記錄一下 函式包括 找到兩個單鏈表相交的起始節點 反轉單鏈表 刪除鍊錶中等於給定值 val 的所有節點 definition for singly linked list.class listnode object def init self,x self.val x self...