常見簡單的鏈表面試題

2021-10-04 21:26:08 字數 3306 閱讀 3250

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 刪除乙個無頭單鏈表的非尾結點 ...