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...