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

        共 2988字,需瀏覽 6分鐘

         ·

        2020-11-07 02:17

        算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(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.

        題意


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

        class Solution:
        ????def partition(self, head: ListNode, x: int) -> ListNode:
        ????????# 創(chuàng)建兩個(gè)鏈表
        ????????left?= ListNode(0)
        ????????right?= ListNode(0)
        ????????# 以及用來遍歷這兩個(gè)鏈表的指針
        ????????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)該怎么辦呢?
        其實(shí)也是很簡(jiǎn)單的,我們可以遍歷鏈表,如果發(fā)現(xiàn)了大于等于x的元素就將它挪到鏈表的最后。這樣當(dāng)我們遍歷結(jié)束的時(shí)候,就完成了鏈表的操作。這個(gè)思路雖然簡(jiǎn)單,但是在實(shí)現(xiàn)的時(shí)候有很多坑點(diǎn),需要特別小心。
        比如我們需要一個(gè)值來記錄遍歷的重點(diǎn),因?yàn)槲覀冊(cè)诒闅v的時(shí)候可能會(huì)將一些元素挪到鏈表的最后。所以我們就不能以None來作為終點(diǎn)了,否則會(huì)導(dǎo)致死循環(huán)。我們需要以大于等于x的第一個(gè)元素作為結(jié)束點(diǎn),當(dāng)遍歷到了這個(gè)位置的時(shí)候結(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
        ????????????
        ????????# 記錄遍歷的終點(diǎn)
        ????????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
        ????????????????# 如果終點(diǎn)是None的話則進(jìn)行更新
        ????????????????# end_point只會(huì)更新一次
        ????????????????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ù)雜度也不同。相對(duì)來說,第一種做法更加簡(jiǎn)單一些,第二種稍稍復(fù)雜,但是也并不難,只要熟悉鏈表的基本操作,應(yīng)該都是可以做出來的。
        關(guān)于鏈表相關(guān)的問題我們應(yīng)該已經(jīng)做了不少了,今天的題目算是很基礎(chǔ)了,相信大家肯定都沒有問題,我也就不再贅述了。

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


        上期推文:

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

        瀏覽 46
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 欧美青青操 | 鲁丝一区二区三区免费 | 国产黄色精品 | 色情片在线播放 | 国产靠逼片直接看的 |