<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實戰(zhàn)86: 分隔鏈表

          共 2988字,需瀏覽 6分鐘

           ·

          2020-11-07 02:17

          算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個公眾號后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問題叫做?分隔鏈表,我們先來看題面:

          https://leetcode-cn.com/problems/partition-list/

          Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.


          You should preserve the original relative order of the nodes in each of the two partitions.

          題意


          給定一個僅包含 0 和 1 、大小為 rows x cols 的二維二進(jìn)制矩陣,找出只包含 1 的最大矩形,并返回其面積。

          樣例

          輸入: head = 1->4->3->2->5->2, x = 3
          輸出: 1->2->2->4->3->5



          解題

          https://www.cnblogs.com/techflow/p/13365497.html

          題解

          由于問題當(dāng)中并沒有對我們?nèi)绾翁幚礞湵硪约爱?dāng)中的元素做出限制,所以我們可以隨意操作這個鏈表以及其中的數(shù)據(jù),很容易想到最簡單的方法就是我們根據(jù)x將鏈表當(dāng)中的元素分成兩個部分,分別存入兩個鏈表當(dāng)中,最后再將這兩個鏈表合并在一起。合并的方式也非常簡單,只需要將鏈表連接在一起即可。
          這種思路非常無腦,幾乎不涉及什么難點,只需要遍歷鏈表然后分別插入不同的鏈表即可,最后再把這兩個鏈表合并成一個就搞定了。
          我們很容易就可以寫出代碼:

          class Solution:
          ????def partition(self, head: ListNode, x: int) -> ListNode:
          ????????# 創(chuàng)建兩個鏈表
          ????????left?= ListNode(0)
          ????????right?= ListNode(0)
          ????????# 以及用來遍歷這兩個鏈表的指針
          ????????ln?= left
          ????????rn = right
          ????????pnt = head
          ????????while?pnt is?not None:
          ????????????# 小于x則插入left,否則插入right
          ????????????if?pnt.val < x:
          ????????????????ln.next?= ListNode(pnt.val)
          ????????????????ln?= ln.next
          ????????????else:
          ????????????????rn.next?= ListNode(pnt.val)
          ????????????????rn = rn.next
          ????????????pnt = pnt.next
          ????????
          ????????# 將leftright合并
          ????????ln.next?= right.next
          ????????return?left.next


          這樣我們固然做了出來,但是我們是在拋棄原鏈表的基礎(chǔ)上做出來的,畢竟開辟了額外的空間。如果我們想要不創(chuàng)建新的鏈表來解決這題應(yīng)該怎么辦呢?
          其實也是很簡單的,我們可以遍歷鏈表,如果發(fā)現(xiàn)了大于等于x的元素就將它挪到鏈表的最后。這樣當(dāng)我們遍歷結(jié)束的時候,就完成了鏈表的操作。這個思路雖然簡單,但是在實現(xiàn)的時候有很多坑點,需要特別小心。
          比如我們需要一個值來記錄遍歷的重點,因為我們在遍歷的時候可能會將一些元素挪到鏈表的最后。所以我們就不能以None來作為終點了,否則會導(dǎo)致死循環(huán)。我們需要以大于等于x的第一個元素作為結(jié)束點,當(dāng)遍歷到了這個位置的時候結(jié)束。還有很多其他關(guān)于鏈表操作的細(xì)節(jié),我們可以來查看代碼:


          class?Solution:
          ????def?partition(self, head: ListNode, x: int)?-> ListNode:
          ????????tail = head
          ????????if?head is?None:
          ????????????return?None
          ????????
          ????????# 找到結(jié)尾,當(dāng)找到了大于等于x的元素就放入結(jié)尾后面
          ????????while?tail.next is?not?None:
          ????????????tail = tail.next
          ????????????
          ????????# 記錄遍歷的終點
          ????????end_point = None
          ????????
          ????????pnt = ListNode(0)
          ????????pnt.next = head
          ????????head = pnt

          ????????while?pnt.next is?not?end_point:
          ????????????cur = pnt.next
          ????????????if?cur.val >= x:
          ????????????????# 插入在末尾
          ????????????????tail.next = cur
          ????????????????tail = cur
          ????????????????# 如果終點是None的話則進(jìn)行更新
          ????????????????# end_point只會更新一次
          ????????????????if?end_point is?None:
          ????????????????????end_point = cur
          ????????????????pnt.next = cur.next
          ????????????????continue
          ????????????pnt = pnt.next
          ????????tail.next = None
          ????????return?head.next

          總結(jié)

          在這題當(dāng)中,我們面臨的問題是操作鏈表,將鏈表當(dāng)中的一些元素提取出來放在鏈表最后。無論我們是自己創(chuàng)建新的鏈表來滿足條件,還是在原鏈表的基礎(chǔ)上進(jìn)行修改,算法的復(fù)雜度都是一樣的,只是空間復(fù)雜度不同,也因此帶來的編碼復(fù)雜度也不同。相對來說,第一種做法更加簡單一些,第二種稍稍復(fù)雜,但是也并不難,只要熟悉鏈表的基本操作,應(yīng)該都是可以做出來的。
          關(guān)于鏈表相關(guān)的問題我們應(yīng)該已經(jīng)做了不少了,今天的題目算是很基礎(chǔ)了,相信大家肯定都沒有問題,我也就不再贅述了。

          好了,今天的文章就到這里,如果覺得有所收獲,請順手點個在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動力。


          上期推文:

          LeetCode50-80題匯總,速度收藏!
          LeetCode刷題實戰(zhàn)81:搜索旋轉(zhuǎn)排序數(shù)組 II
          LeetCode刷題實戰(zhàn)82:刪除排序鏈表中的重復(fù)元素 II
          LeetCode刷題實戰(zhàn)83:刪除排序鏈表中的重復(fù)元素
          LeetCode刷題實戰(zhàn)84:?柱狀圖中最大的矩形

          瀏覽 46
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  怡红院一区二区三区 | 无码人妻一区二区三区精品不付款 | 美女扒开尿口让男生桶爽视频 | 亚洲欧美综合色图 | 黄色天堂av |