鍊錶 面試鍊錶題目這麼重要你確定不看看嘛?

2021-10-08 05:46:33 字數 4588 閱讀 4591

不要糾結,幹就完事了,熟練度很重要!!!多練習,多總結!!!

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。

示例:輸入:1->2->4, 1->3->4

輸出:1->1->2->3->4->4

關於鍊錶題目,我們要知道乙個小技巧,那就是關於哨兵節點的設定!因為很多時候我們需要返回的是鍊錶,這時候我們指定乙個哨兵節點指向操作後鍊錶的頭節點!這時候其他節點就可以後移進行其他操作,不用直接返回哨兵的next節點即可得到鍊錶!

回到本題,我們首先new乙個哨兵節點,還有乙個cur指標從哨兵節點出發,來記錄排序的各個節點,其次本題需要借助雙指標,分別指向兩個鍊錶的節點,每次我們對比兩個鍊錶相應指標指向元素的大小,將較小的節點加入cur,依次來進行排序

class

solution

if(l2==

null

) listnode phead=

newlistnode(0

);listnode cur=phead;

while

(l1!=

null

&&l2!=

null

)else

cur=cur.next;}if

(l1==

null)if

(l2==

null

)return phead.next;

}}

給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。

示例:給定乙個鍊錶: 1->2->3->4->5, 和 n = 2.

當刪除了倒數第二個節點後,鍊錶變為 1->2->3->5.

說明:給定的 n 保證是有效的。

高階:你能嘗試使用一趟掃瞄實現嗎?

本題也是鍊錶比較經典的雙指標問題了!有乙個查詢倒數第n個節點,這題是刪除倒數第n個節點,那麼我們除了查詢到倒數第n個,還要找到其前面的乙個節點,然後直接p.next=p.next.next就把倒數第n個節點刪除了!

那麼很簡單,除了哨兵節點外,我們在定義兩個指標pre和cur,為了最後乙個指向倒數第n個的前乙個,乙個指向倒數第n個。初始化時pre指向哨兵節點,cur指向煉表頭節點,pre和cur整好相差乙個,這樣就可以查詢到前乙個節點了!然後鍊錶的頭節點head先向後移動n次,然後pre和cur與head同時移動,直到head指向null為止!這時cur就指向倒數第n個節點,而pre就是前乙個節點了!完成!

class

solution

listnode phead=

newlistnode(0

);phead.next=head;

listnode pre=phead;

listnode cur=head;

int k=1;

while

(k<=n)

while

(cur!=

null

&&head!=

null

) pre.next=pre.next.next;

return phead.next;

}}

給定乙個鍊錶,判斷鍊錶中是否有環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。如果 pos 是 -1,則在該鍊錶中沒有環。

鍊錶成環檢測,經典的快慢指標!除了哨兵節點的設定外,定義slow和fast兩個指標,每次slow移動一步,fast移動兩步,如果有環時,兩指標會相遇,即可返回true,相反,如果沒有環,那麼fast指標將率先遍歷到鍊錶末尾即null,那麼返回false

public

class

solution

listnode slow=head;

listnode fast=head;

while

(fast!=

null

&&fast.next!=

null)}

if(slow!=fast)

return

false;}

}

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

輸出:7 -> 0 -> 8

原因:342 + 465 = 807

雖然是第2題,但是大廠也是考過的哦

不多說,開講,設定乙個變數用來儲存每次相加的結果,同時還承擔乙個進製的功能。遍歷兩個鍊錶,只要有乙個鍊錶不為空或者進製不為0,那麼就繼續執行。每次我們新增的節點val值,等於鍊錶節點值可能兩個鍊錶節點相加,也可能只是某個鍊錶的節點,因為沒說兩個鍊錶一定是等長的!對10進行取餘運算,即為本位相加的結果,同時我們要記錄進製情況,進製就等於當前本位鍊錶加法對10進行整除結果

class

solution

if(l2==

null

) listnode phead=

newlistnode(0

);listnode cur=phead;

int tmp=0;

while

(l1!=

null

||l2!=

null

||tmp!=0)

if(l2!=

null

) cur.next=

newlistnode

(tmp%10)

; tmp=tmp/10;

cur=cur.next;

}return phead.next;

}}

運用你所掌握的資料結構,設計和實現乙個 lru (最近最少使用) 快取機制。它應該支援以下操作:獲取資料 get 和 寫入資料 put 。

獲取資料 get(key) - 如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總是正數),否則返回 -1。

寫入資料 put(key, value) - 如果金鑰不存在,則寫入其資料值。當快取容量達到上限時,它應該在寫入新資料之前刪除最近最少使用的資料值,從而為新的資料值留出空間。

高階:你是否可以在 o(1) 時間複雜度內完成這兩種操作?

示例:lrucache cache = new lrucache( 2 /* 快取容量 */ );

cache.put(1, 1);

cache.put(2, 2);

cache.get(1); // 返回 1

cache.put(3, 3); // 該操作會使得金鑰 2 作廢

cache.get(2); // 返回 -1 (未找到)

cache.put(4, 4); // 該操作會使得金鑰 1 作廢

cache.get(1); // 返回 -1 (未找到)

cache.get(3); // 返回 3

cache.get(4); // 返回 4

lru是乙個非常重要的演算法,底層類似linkedhashmap即hashmap+雙向鍊錶結構!在redis和作業系統中,設計快取淘汰演算法都能看到lru的影子!!!很重要!!!

public

class

lrucache

private

void

addnode

(linkednode node)

private

void

removenode

(linkednode node)

private

void

movetohead

(linkednode node)

private linkednode poptail()

private hashtable cache =

newhashtable

();private int size;

private int capacity;

private linkednode head, tail;

public

lrucache

(int capacity)

public int get

(int key)

public

void

put(int key, int value)

}else

}}

覺得本部落格有用的客官,可以給個點讚+收藏哦! 嘿嘿

mysql 雙向鍊錶 面試 雙向鍊錶

面試遇到乙個題目,寫乙個雙向鍊錶,包括新增,刪除,查詢和遍歷。當時寫了一塌糊塗,後來自己都覺得想笑,雙向寫著寫著被我寫成了單向不像單向,雙向不像雙向了,真是不倫不類。之後 我把這個問題整理了一下,希望對以後的小夥伴 有幫助。如果有錯誤,希望指出 以免誤人。謝謝!public class linkno...

LeetCode 鍊錶 面試題 反轉鍊錶

題目 於 leetcode 上第 206號 reverse linked list 問題 反轉乙個單鏈表。題目難度為 easy。題目描述 reverse a singly linked list.反轉乙個單鏈表 input 1 2 3 4 5 null output 5 4 3 2 1 null 複...

鍊錶及鏈表面試題

首先看一下順序表和煉表的優缺點,分別在什麼場景下使用?源 list.h ifndef list h define list h include include include typedef int datatype typedef struct node node,pnode,plist init...