1、鍊錶的合併
腸子要悔青
leetcode 原題
第一種方法:開闢乙個新的鍊錶
class
solution
:def
mergetwolists
(self, l1: listnode, l2: listnode)
-> listnode:
res=listnode(0)
p=res#注意這裡,p=res 操作res指標,返回p
while l1 and l2:
if l1.valres.
next
=l1 l1=l1.
next
else
: res.
next
=l2 l2=l2.
next
res=res.
next
if l1:
res.
next
=l1 if l2:
res.
next
=l2 return p.
next
# 構建了乙個新的鍊錶,返回什麼?返回p.next
# 當兩者都存在的時候,進入迴圈,後面直接接res.next=l1
第二種方法:遞迴方法
class
solution
:def
mergetwolists
(self, l1: listnode, l2: listnode)
-> listnode:
ifnot l1:
return l2
ifnot l2:
return l1
if l1.vall1.
next
=self.mergetwolists(l1.
next
,l2)
return l1
else
: l2.
next
=self.mergetwolists(l1,l2.
next
)return l2
2、鍊錶的反轉
我們可以申請兩個指標,第乙個指標叫 pre,最初是指向 null 的。
第二個指標 cur 指向 head,然後不斷遍歷 cur。
每次迭代到 cur,都將 cur 的 next 指向 pre,然後 pre 和 cur 前進一位。
都迭代完了(cur 變成 null 了),pre 就是最後乙個節點了。
class
solution
:def
reverselist
(self, head: listnode)
-> listnode:
pre=
none
cur=head
while cur:
node=cur.
next
cur.
next
=pre
pre=cur
cur=node
return pre
leetcode動畫連線
3、兩個鍊錶的第乙個公眾節點
鍊錶中常用的:快慢雙指標
公眾節點的判斷:雙指標浪漫相遇,定義兩個指標node1,node2, 依次遍歷,直到node1=node2時,是公眾節點,node1到達heada的尾部,重新定位到headb的頭節點,當node2 到達headb的尾節點時,重新定位到heada的頭節點
class
solution
:def
getintersectionnode
(self, heada: listnode, headb: listnode)
-> listnode:
node1,node2=heada,headb
while node1!=node2:
node1=node1.
next
if node1 else headb
node2=node2.
next
if node2 else heada
return node1
4、刪除鍊錶的節點
leetcode連線
curr.next = curr.next.next 關鍵在於判讀cur.next是否為val, 這樣就不需要儲存前驅節點了
class
solution
:def
deletenode
(self, head: listnode, val:
int)
-> listnode:
pre=listnode(0)
pre.
next
=head
if head.val==val:
return head.
next
while head.
next
:if head.
next
.val==val:
head.
next
=head.
next
.next
break
head=head.
next
return pre.
next
5、鍊錶中倒數第k個節點
設定s,f 快慢指標,f比s快k步,當快指標到達尾部時,慢指標指向的位置即為倒數第k個節點。
leetcode鏈結
class
solution
:def
getkthfromend
(self, head: listnode, k:
int)
-> listnode:
ifnot head:
return head
p1=p2=head
for i in
range
(k-1):
#快慢指標之間的距離是k-1,當快指標指向最後乙個節點
p2=p2.
next
while p2.
next
:#當快指標指向最後乙個節點
p1=p1.
next
p2=p2.
next
return p1#返回慢指標此時的位置
常見單鏈表面試題
面試中經常被問到有關鍊錶的問題,現總結如下 此處的鍊錶結構為不帶頭結點的單鏈表 單鏈表結構 struct listnode 1 尾插法建立單鏈表 listnode buildlisttail int n else return head 輸入1 2 3 4,輸出1 2 3 42 頭插法建立單鏈表 l...
鏈表面試題
不改變鍊錶結構,從尾到頭列印單鏈表 遞迴實現 void printlistrevers recursively plist phead printf d phead data 當鍊表非常長的時候,遞迴實現的會導致函式呼叫層級很深,可能導致呼叫棧溢位。用棧不會出現此類情況,顯然用棧實現 的魯棒性會好一...
鏈表面試題
從尾到頭列印單鏈表 棧 遞迴 從尾到頭列印鍊錶 includevoid printtailtohead listnode head while s.empty 空間複雜度o n void printtailtoheadr listnode head cout data 刪除乙個無頭單鏈表的非尾結點 ...