中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

山西做網(wǎng)站的企業(yè)站長工具官網(wǎng)域名查詢

山西做網(wǎng)站的企業(yè),站長工具官網(wǎng)域名查詢,數(shù)碼公司網(wǎng)站建設(shè)的意義,浙江省公路建設(shè)發(fā)票網(wǎng)站?刷題計劃day4繼續(xù),可以點(diǎn)個免費(fèi)的贊哦~ 下一期將會開啟哈希表刷題專題,往期可看專欄,關(guān)注不迷路, 您的支持是我的最大動力🌹~ 目錄 ?刷題計劃day4繼續(xù),可以點(diǎn)個免費(fèi)的贊哦~ 下一期將會開啟哈希表刷題…

?刷題計劃day4繼續(xù),可以點(diǎn)個免費(fèi)的贊哦~

下一期將會開啟哈希表刷題專題,往期可看專欄,關(guān)注不迷路,

您的支持是我的最大動力🌹~

目錄

?刷題計劃day4繼續(xù),可以點(diǎn)個免費(fèi)的贊哦~

下一期將會開啟哈希表刷題專題,往期可看專欄,關(guān)注不迷路,

您的支持是我的最大動力🌹~

題目一:19. 刪除鏈表的倒數(shù)第 N 個結(jié)點(diǎn)

法一:計算鏈表長度

法二:雙指針

題目二:面試題 02.07. 鏈表相交

法一:雙指針

法二:合并鏈表實(shí)現(xiàn)同步移動

題目三:142. 環(huán)形鏈表 II

法一:快慢指針法

1.判斷鏈表是否有環(huán)

2.如果有環(huán),如何找到環(huán)的入口

2.1 n==1

2.2 n>1

法二:哈希表


題目一:19. 刪除鏈表的倒數(shù)第 N 個結(jié)點(diǎn)

leetcode:19. 刪除鏈表的倒數(shù)第 N 個結(jié)點(diǎn)

(https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/)

法一:計算鏈表長度

常規(guī)思路:先遍歷得到鏈表長度L,然后再次遍歷到 L-n+1個結(jié)點(diǎn),便是我們需要刪除的結(jié)點(diǎn);

這里我們還是使用虛擬頭結(jié)點(diǎn)統(tǒng)一,于是從虛擬結(jié)點(diǎn)開始遍歷L-n+1個結(jié)點(diǎn),它的下一個結(jié)點(diǎn)便是我們要刪除的結(jié)點(diǎn),這樣我們只需修改一次指針,就可完成刪除操作。

如圖輔助理解:

AC代碼

class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummyHead = new ListNode();dummyHead.next=head;ListNode cur = dummyHead;int length = getLength(head);for (int i=1;i<length-n+1;i++){cur = cur.next;}if(cur.next!=null){//避免空指針cur.next = cur.next.next;//刪除操作}return dummyHead.next;
?}public int getLength(ListNode head){int length = 0;while(head != null){length++;head=head.next;}return length;}
}

法二:雙指針

主要思路:

要刪除倒數(shù)第n個,我們可以使用雙指針,這樣不用去求長度;

保持一個相差n的區(qū)間,fast在前,slow在后。這樣等fast走到鏈表末尾,slow對應(yīng)的就是我們要刪除的結(jié)點(diǎn);

因?yàn)殒湵韯h除我們需要通過前一個結(jié)點(diǎn),所以將相差區(qū)間設(shè)為n+1,可以結(jié)合圖理解:

AC代碼

class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummyHead = new ListNode();dummyHead.next=head;ListNode fast = dummyHead;ListNode slow = dummyHead;
?// 只要快慢指針相差 n 個結(jié)點(diǎn)即可for (int i=1;i<=n+1;i++){fast = fast.next;}while (fast!=null){fast = fast.next;slow = slow.next;}
?if(slow.next!=null){slow.next = slow.next.next;}return dummyHead.next;}
}

題目二:面試題 02.07. 鏈表相交

leetcode:面試題 02.07. 鏈表相交

(https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/description/)

簡單來說,就是求兩個鏈表交點(diǎn)節(jié)點(diǎn)的指針。 這里要注意,交點(diǎn)不是數(shù)值相等,而是指針相等。

為了方便舉例,假設(shè)節(jié)點(diǎn)元素數(shù)值相等,則節(jié)點(diǎn)指針相等。

看如下兩個鏈表,目前curA指向鏈表A的頭結(jié)點(diǎn),curB指向鏈表B的頭結(jié)點(diǎn):

我們求出兩個鏈表的長度,并求出兩個鏈表長度的差值,然后讓curA移動到,和curB 末尾對齊的位置,如圖

此時我們就可以比較curA和curB是否相同,如果不相同,同時向后移動curA和curB,如果遇到curA == curB,則找到交點(diǎn)。

否則循環(huán)退出返回空指針。

AC代碼

法一:雙指針

public class Solution {
?public ListNode getIntersectionNode(ListNode headA, ListNode headB) {// 初始化兩個鏈表的當(dāng)前節(jié)點(diǎn)ListNode cur1 = headA;ListNode cur2 = headB;// 初始化兩個鏈表的長度int len1 = 0;int len2 = 0;
?// 求cur1長度while (cur1 != null) {len1++;cur1 = cur1.next;}// 求cur2長度while (cur2 != null) {len2++;cur2 = cur2.next;}
?// 重新初始化兩個鏈表的當(dāng)前節(jié)點(diǎn)cur1 = headA;cur2 = headB;
?// 如果第一個鏈表比第二個短,交換兩個鏈表的頭節(jié)點(diǎn)和長度if (len1 < len2) {//1. swap (len1, len2);int temp = len1;len1 = len2;len2 = temp;//2. swap (cur1, cur2);ListNode temNode = cur1;cur1 = cur2;cur2 = temNode;}
?// 計算長度的差值int gap = len1 - len2;// 移動較長鏈表的當(dāng)前節(jié)點(diǎn),使cur1與cur2的末尾位置對齊,看圖while (gap-- > 0) {cur1 = cur1.next;}
?// 同時遍歷兩個鏈表,遇到相同則直接返回while (cur1 != null) {if (cur1 == cur2) {return cur1; // 返回相交的節(jié)點(diǎn)}cur1 = cur1.next;cur2 = cur2.next;}
?// 如果兩個鏈表沒有相交,返回nullreturn null;}
}

法二:合并鏈表實(shí)現(xiàn)同步移動

主要思路:

  1. 同步移動指針

    • 使用一個 while 循環(huán),只要 p1p2 沒有相遇,就繼續(xù)移動指針。

    • 對于 p1,如果它到達(dá)了鏈表 A 的末尾(即 p1null),則將它移動到鏈表 B 的頭部,重新開始遍歷。

    • 對于 p2,如果它到達(dá)了鏈表 B 的末尾(即 p2null),則將它移動到鏈表 A 的頭部,重新開始遍歷。

  2. 相遇即相交

    • 當(dāng)兩個指針 p1p2 相遇時,它們指向的就是鏈表相交的節(jié)點(diǎn)。因?yàn)閮蓚€指針最終都會遍歷完兩個鏈表,如果鏈表有相交點(diǎn),它們最終會在相交點(diǎn)相遇。

  3. 返回結(jié)果

    • 一旦 p1p2 相遇,即它們指向同一個節(jié)點(diǎn),就返回這個節(jié)點(diǎn)。

 public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {// p1 指向 A 鏈表頭結(jié)點(diǎn),p2 指向 B 鏈表頭結(jié)點(diǎn)ListNode p1 = headA, p2 = headB;while (p1 != p2) {// p1 走一步,如果走到 A 鏈表末尾,轉(zhuǎn)到 B 鏈表if (p1 == null) p1 = headB;else ? ? ? ? ?  p1 = p1.next;// p2 走一步,如果走到 B 鏈表末尾,轉(zhuǎn)到 A 鏈表if (p2 == null) p2 = headA;else ? ? ? ? ?  p2 = p2.next;}return p1;}
}

題目三:142. 環(huán)形鏈表 II

leetcode:142. 環(huán)形鏈表 II

(https://leetcode.cn/problems/linked-list-cycle-ii/description/)

法一:快慢指針法

判斷鏈表是否有環(huán),我們一般可以使用快慢指針法

此題還是有一定難度,考察了對鏈表環(huán)的判斷,已經(jīng)需要進(jìn)行數(shù)學(xué)運(yùn)算,下文會進(jìn)行詳細(xì)解釋。

對于此題大致分為兩大步:

1.判斷鏈表是否有環(huán)

2.如果有環(huán),如何找到環(huán)的入口


1.判斷鏈表是否有環(huán)

分別定義fast,slow指針,fast指針每次移動兩個節(jié)點(diǎn),slow指針每次移動一個節(jié)點(diǎn),如果 fast 和 slow指針在途中相遇 ,說明這個鏈表有環(huán)。

2.如果有環(huán),如何找到環(huán)的入口

這步已經(jīng)可以判斷鏈表是否有環(huán)了,接下來是尋找環(huán)的入口,需要用到一點(diǎn)數(shù)學(xué)運(yùn)算。

假設(shè)從頭結(jié)點(diǎn)到環(huán)形入口節(jié)點(diǎn) 的節(jié)點(diǎn)數(shù)為x。 環(huán)形入口節(jié)點(diǎn)到 fast指針與slow指針相遇節(jié)點(diǎn) 節(jié)點(diǎn)數(shù)為y。 從相遇節(jié)點(diǎn) 再到環(huán)形入口節(jié)點(diǎn)節(jié)點(diǎn)數(shù)為 z。 如圖所示:

那么當(dāng)相遇時:

slow指針走過的節(jié)點(diǎn)數(shù)為: x + y, fast指針走過的節(jié)點(diǎn)數(shù):x + y + n (y + z),n為fast指針在環(huán)內(nèi)走了n圈才遇到slow指針, (y+z)為 一圈內(nèi)節(jié)點(diǎn)的個數(shù)A。

加深理解注:

1.fast指針為什么 n (y + z)? 因?yàn)閒ast比slow快,fast進(jìn)入圈后至少需要一圈后追反超slow,由此也可知道,n>=1(后續(xù)解題會用)。

2.為什么slow就不用比如k(y+z)? 因?yàn)閟low進(jìn)入圈后在一圈內(nèi)一定會被fast追上

3.那為什么slow一圈內(nèi)就一定會被fast追上呢? 可以這樣通俗理解:首先fast會比slow快1,如果slow走一圈,fast就會走兩圈,那一定會追上。

因?yàn)閒ast指針是一步走兩個節(jié)點(diǎn),slow指針一步走一個節(jié)點(diǎn), 所以 slow指針走過的節(jié)點(diǎn)數(shù) * 2 = fast指針走過的節(jié)點(diǎn)數(shù),所以可以列出方程:

(x + y) * 2 = x + y + n (y + z)

因?yàn)槲覀円噎h(huán)形入口,即需要找x,將x單獨(dú)放出來化簡:

x = n (y + z) - y

但是我們看一下這個式子呢,也發(fā)現(xiàn)不了什么,我們是想通過右邊的參數(shù)來求x,但發(fā)現(xiàn)目前右側(cè)也沒啥特殊形式,還有個-y。于是我們可以提一個(y+z)出來,

x = (n - 1) (y + z) + z(此處n>=1,前面有解釋)

此時就明了了。


2.1 n==1

當(dāng) n為1的時候,公式就化解為 x = z

這就意味著,從頭結(jié)點(diǎn)出發(fā)一個指針,從相遇節(jié)點(diǎn)也出發(fā)一個指針,這兩個指針每次只走一個節(jié)點(diǎn), 那么當(dāng)這兩個指針相遇的時候就是 環(huán)形入口的節(jié)點(diǎn)。

也就是在相遇節(jié)點(diǎn)處,定義一個指針index1,在頭結(jié)點(diǎn)處定一個指針index2。

讓index1和index2同時移動,每次移動一個節(jié)點(diǎn), 那么他們相遇的地方就是 環(huán)形入口的節(jié)點(diǎn)。

2.2 n>1

那么 n如果大于1是什么情況呢,就是fast指針在環(huán)形轉(zhuǎn)n圈之后才遇到 slow指針。

其實(shí)這種情況和n為1的時候效果是一樣的,一樣可以通過這個方法找到 環(huán)形的入口節(jié)點(diǎn),只不過,index1 指針在環(huán)里 多轉(zhuǎn)了(n-1)圈,然后再遇到index2,相遇點(diǎn)依然是環(huán)形的入口節(jié)點(diǎn)。

代碼如下:

public class Solution {public ListNode detectCycle(ListNode head) {ListNode fast = head;ListNode slow = head;while(fast!=null && fast.next!=null){fast = fast.next.next;slow = slow.next;
?//相遇,有環(huán)if(fast==slow){ListNode index1  = fast;ListNode index2  = head;// 兩個指針,從頭結(jié)點(diǎn)和相遇結(jié)點(diǎn),各走一步,直到相遇,相遇點(diǎn)即為環(huán)入口while (index1 != index2){index1 = index1.next;index2 = index2.next;}return index1;}
?}return null;}
}

法二:哈希表

這個思路就簡單很多,時間復(fù)雜度:O(N),空間復(fù)雜度:O(N);

但第一種雙指針的解法也需要掌握,時間復(fù)雜度:O(N),空間復(fù)雜度:O(1)。

關(guān)于哈希表我們下期也會做相應(yīng)的專題刷題。

主要思路:遍歷鏈表中的每個節(jié)點(diǎn),并將它記錄下來;一旦遇到了此前遍歷過的節(jié)點(diǎn),就可以判定鏈表中存在環(huán)。借助哈希表可以很方便地實(shí)現(xiàn)。

代碼:

詳細(xì)見注解

public class Solution {public ListNode detectCycle(ListNode head) {// 初始化指針pos指向頭結(jié)點(diǎn)ListNode pos = head;// 使用HashSet來存儲已經(jīng)訪問過的節(jié)點(diǎn)Set<ListNode> visited = new HashSet<ListNode>();
?// 遍歷鏈表while (pos != null) {// 如果當(dāng)前節(jié)點(diǎn)已經(jīng)被訪問過,說明存在環(huán),返回當(dāng)前節(jié)點(diǎn)if (visited.contains(pos)) {return pos;} else {// 否則,將當(dāng)前節(jié)點(diǎn)添加到visited集合中visited.add(pos);}// 移動到下一個節(jié)點(diǎn)pos = pos.next;}
?// 如果遍歷完整個鏈表都沒有發(fā)現(xiàn)環(huán),返回nullreturn null;}
}

http://m.risenshineclean.com/news/60227.html

相關(guān)文章:

  • 公司網(wǎng)站做地圖地址互聯(lián)網(wǎng)推廣怎么找渠道
  • 商城網(wǎng)站建設(shè)預(yù)算要多少錢關(guān)鍵詞推廣方式
  • 網(wǎng)站標(biāo)簽怎么做自媒體引流推廣
  • 花瓣網(wǎng) 素材 圖庫響應(yīng)式網(wǎng)站 樂云seo品牌
  • 政府網(wǎng)站什么程序做的百度蜘蛛池自動收錄seo
  • 網(wǎng)站怎么做競價推廣珠海seo關(guān)鍵詞排名
  • 織夢網(wǎng)站案例企業(yè)網(wǎng)站推廣建議
  • 淘寶優(yōu)惠劵網(wǎng)站怎么做app制作一個需要多少錢
  • 長壽網(wǎng)站建設(shè)html網(wǎng)頁制作用什么軟件
  • 隨州公司做網(wǎng)站網(wǎng)址大全
  • 網(wǎng)站站外優(yōu)化網(wǎng)絡(luò)公司的推廣
  • 常州優(yōu)化網(wǎng)站網(wǎng)絡(luò)優(yōu)化主要做什么
  • 上杭網(wǎng)站定制最新網(wǎng)絡(luò)營銷方式有哪些
  • 武漢制作網(wǎng)站公司哪些行業(yè)適合做網(wǎng)絡(luò)推廣
  • 網(wǎng)站設(shè)計東莞微博付費(fèi)推廣有用嗎
  • 剛做的單頁網(wǎng)站怎么預(yù)覽軟件培訓(xùn)機(jī)構(gòu)
  • 游戲網(wǎng)站建設(shè)一條龍濟(jì)南網(wǎng)站建設(shè)公司選濟(jì)南網(wǎng)絡(luò)
  • 網(wǎng)站開發(fā)維護(hù)者百度搜索風(fēng)云榜官網(wǎng)
  • 佛山最新通知今天大冶seo網(wǎng)站優(yōu)化排名推薦
  • 網(wǎng)站建設(shè)開發(fā)網(wǎng)站案例項(xiàng)目費(fèi)用合肥網(wǎng)絡(luò)優(yōu)化公司有幾家
  • 京東商城網(wǎng)站建設(shè)目標(biāo)微信營銷軟件
  • wordpress登入界面滎陽seo
  • 一般的政府網(wǎng)站空間多少錢一年黑帽seo工具
  • 做代購注冊什么網(wǎng)站b站視頻推廣怎么買
  • 河北涿州網(wǎng)站建設(shè)新站seo優(yōu)化快速上排名
  • 河南網(wǎng)站推廣今日頭條熱搜榜前十名
  • 桃花島網(wǎng)站是什么網(wǎng)站優(yōu)化排名公司
  • 建設(shè)服裝網(wǎng)站的意義營業(yè)推廣促銷方式有哪些
  • 濟(jì)南網(wǎng)站優(yōu)化技術(shù)廠家全球疫情最新數(shù)據(jù)
  • 網(wǎng)站建設(shè)百度優(yōu)化軟文推廣營銷