Chapter 3鏈表

單鏈表

problem2 兩數(shù)相加

給出兩個 非空 的鏈表用來表示兩個非負的整數(shù)。其中摊唇,它們各自的位數(shù)是按照 逆序 的方式存儲的左医,并且它們的每個節(jié)點只能存儲 一位 數(shù)字。

如果特姐,我們將這兩個數(shù)相加起來晶丘,則會返回一個新的鏈表來表示它們的和。

您可以假設(shè)除了數(shù)字 0 之外,這兩個數(shù)都不會以 0 開頭浅浮。

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        flag = 0
        p = pre = ListNode(0)
        while l1 or l2:
            if l1 is None:
                l1 = ListNode(0)
            if l2 is None:
                l2 = ListNode(0)
            res = (l1.val + l2.val + flag) % 10
            flag = (l1.val + l2.val +flag) // 10
            p.next = ListNode(res)
            p = p.next
            #p.next = p = ListNode(val)
            l1 = l1.next
            l2 = l2.next
            if (l1 is None) and (l2 is None) and flag:
                p.next = ListNode(1)
        return pre.next
                        

21. 合并兩個有序鏈表

將兩個有序鏈表合并為一個新的有序鏈表并返回沫浆。新鏈表是通過拼接給定的兩個鏈表的所有節(jié)點組成的。

示例:

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

用遞歸滚秩,比自己寫的迭代簡潔

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def mergeTwoLists(self, l1, l2):
        if l1 is None:
            return l2
        elif l2 is None:
            return l1
        elif l1.val < l2.val:
            l1.next = self.mergeTwoLists(l1.next, l2)
            return l1
        else:
            l2.next = self.mergeTwoLists(l1, l2.next)
            return l2

83. 刪除排序鏈表中的重復(fù)元素

給定一個排序鏈表专执,刪除所有重復(fù)的元素,使得每個元素只出現(xiàn)一次叔遂。

示例 1:

輸入: 1->1->2
輸出: 1->2
示例 2:

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

\color{red}{自己寫的邏輯過于亂,雖然和別人的功能是一樣的}
ps:雖是刪除但不改變原鏈表而是返回刪除的鏈表

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def deleteDuplicates(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        p = head
        if head is None or head.next is None:
            return head
        while head.next:
            if head.val == head.next.val:
                head.next = head.next.next
            else:
                head = head.next
                # p = head.next
            #p.next = head
        return p

\color{red}{別人的}

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        if head == None or head.next== None:
            return head        
        p = head
        while True:
            if p.val == p.next.val:
                p.next = p.next.next
            else:
                p = p.next
            if p.next==None:
                break            
        return head
203. 移除鏈表元素

刪除鏈表中等于給定值 val 的所有節(jié)點他炊。

示例:

輸入: 1->2->6->3->4->5->6, val = 6
輸出: 1->2->3->4->5
\color{blue}{因為頭結(jié)點也是可能刪除的,所以相比較前題的刪除節(jié)點已艰,不能用head指針返回痊末,而是要用另一個啞元}

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def removeElements(self, head, val):
        """
        :type head: ListNode
        :type val: int
        :rtype: ListNode
        """
        p = ListNode(0)
        p.next = head
        pre =p
        while p and p.next:
            if p.next.val == val:
                p.next = p.next.next
            else:
                p = p.next
        return pre.next

237. 刪除鏈表中的節(jié)點

請編寫一個函數(shù),使其可以刪除某個鏈表中給定的(非末尾)節(jié)點哩掺,你將只被給定要求被刪除的節(jié)點凿叠。

現(xiàn)有一個鏈表 -- head = [4,5,1,9],它可以表示為:

image

示例 1:

輸入: head = [4,5,1,9], node = 5
輸出: [4,1,9]
解釋: 給定你鏈表中值為 5 的第二個節(jié)點嚼吞,那么在調(diào)用了你的函數(shù)之后盒件,該鏈表應(yīng)變?yōu)?4 -> 1 -> 9.

示例 2:

輸入: head = [4,5,1,9], node = 1
輸出: [4,5,9]
解釋: 給定你鏈表中值為 1 的第三個節(jié)點,那么在調(diào)用了你的函數(shù)之后舱禽,該鏈表應(yīng)變?yōu)?4 -> 5 -> 9.

說明:

  • 鏈表至少包含兩個節(jié)點炒刁。
  • 鏈表中所有節(jié)點的值都是唯一的。
  • 給定的節(jié)點為非末尾節(jié)點并且一定是鏈表中的一個有效節(jié)點誊稚。
  • 不要從你的函數(shù)中返回任何結(jié)果翔始。

\color{red}{因為節(jié)點沒有前向的指針,所以采用先把下一節(jié)點的val值賦給該節(jié)點里伯,然后將其的next指針后移一位來刪除節(jié)點}

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def deleteNode(self, node):
        """
        :type node: ListNode
        :rtype: void Do not return anything, modify node in-place instead.
        """   
        node.val = node.next.val
        node.next = node.next.next

\color{gray}{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}
\color{purple}{假如愛情有天意城瞎,快慢指針終會相遇(可用在循環(huán)中,慢走一步疾瓮,快走兩步)}
\color{purple}{快慢指針還可用在查找鏈表的中間節(jié)點}

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

給定一個鏈表脖镀,返回鏈表開始入環(huán)的第一個節(jié)點。 如果鏈表無環(huán)狼电,則返回 null蜒灰。

為了表示給定鏈表中的環(huán),我們使用整數(shù) pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)肩碟。 如果 pos-1卷员,則在該鏈表中沒有環(huán)。

說明:不允許修改給定的鏈表腾务。
示例 1:
輸入:head = [3,2,0,-4], pos = 1
輸出:tail connects to node index 1
解釋:鏈表中有一個環(huán),其尾部連接到第二個節(jié)點削饵。

image

示例 2:
輸入:head = [1,2], pos = 0
輸出:tail connects to node index 0
解釋:鏈表中有一個環(huán)岩瘦,其尾部連接到第一個節(jié)點未巫。
image

示例 3:
輸入:head = [1], pos = -1
輸出:no cycle
解釋:鏈表中沒有環(huán)。
image

進階:
你是否可以不用額外空間解決此題启昧?

\color{red}{把見過的節(jié)點丟集合里叙凡,下次再遇見就是環(huán)的開始}

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def detectCycle(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        s = {None}
        while head not in s:
            s.add(head)
            head = head.next
        return head

\color{red}{還有一個純數(shù)學(xué)的快慢指針解法}

設(shè)環(huán)的起始節(jié)點為 E,快慢指針從 head 出發(fā)密末,快指針速度為 2握爷,設(shè)相交節(jié)點為 X,head 到 E 的距離為 H严里,E 到 X 的距離為 D新啼,環(huán)的長度為 L,那么有:快指針走過的距離等于慢指針走過的距離加快指針多走的距離(多走了 n 圈的 L) 2(H + D) = H + D + nL刹碾,因此可以推出 H = nL - D燥撞,這意味著如果我們讓倆個慢指針一個從 head 出發(fā),一個從 X 出發(fā)的話迷帜,他們一定會在節(jié)點 E 相遇

捕獲.PNG

class Solution(object):
    def detectCycle(self, head):
    slow = fast = head
    while fast and fast.next:
        fast = fast.next.next
        slow = slow.next
        if slow == fast:
        break
    else:
        return None
    while head is not slow:
        head = head.next
        slow = slow.next
    return head

206. 反轉(zhuǎn)鏈表

反轉(zhuǎn)一個單鏈表物舒。
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
進階:
你可以迭代或遞歸地反轉(zhuǎn)鏈表。你能否用兩種方法解決這道題戏锹?

\color{purple}{python多元賦值}

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        p, rev = head, None
        while p:
            rev, rev.next, p = p, rev, p.next
        return rev

\color{purple}{與上法思路一樣冠胯,具體操作不同的常規(guī)解法}
···

Definition for singly-linked list.

class ListNode(object):

def init(self, x):

self.val = x

self.next = None

class Solution(object):
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
cur, rev = head, None
while cur:
p = rev
rev = cur
cur = cur.next
rev.next = p
return rev
···

160. 相交鏈表

編寫一個程序,找到兩個單鏈表相交的起始節(jié)點锦针。
注意:
如果兩個鏈表沒有交點荠察,返回 null.
在返回結(jié)果后,兩個鏈表仍須保持原有的結(jié)構(gòu)伞插。
可假定整個鏈表結(jié)構(gòu)中沒有循環(huán)割粮。
程序盡量滿足 O(n) 時間復(fù)雜度,且僅用 O(1) 內(nèi)存媚污。

圖掛了>_<
\color{purple}{注意的是循環(huán)條件舀瓢,若兩單鏈表沒有交點,兩指針到末尾耗美,都==None京髓,結(jié)束循環(huán),這里如果不用pA != pB的循環(huán)商架,會很麻煩}
\color{blue} {這道題的代碼就幾行堰怨,充分說明了,把數(shù)學(xué)邏輯搞懂了蛇摸,編碼很容易}

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def getIntersectionNode(self, headA, headB):
        """
        :type head1, head1: ListNode
        :rtype: ListNode
        """
        pA=headA
        pB=headB
        while pA!=pB:
            if pA==None:
                pA = headB
            else:
                pA = pA.next
            if pB==None:
                pB = headA
            else:
                pB = pB.next
        return pA

目前的超綱知識:深拷貝备图,排序(算法面試卡片的鏈表模塊)

82. 刪除排序鏈表中的重復(fù)元素 II

\color{red}{虛擬頭結(jié)點}

給定一個排序鏈表,刪除所有含有重復(fù)數(shù)字的節(jié)點,只保留原始鏈表中 *沒有重復(fù)出現(xiàn) *的數(shù)字揽涮。

示例 1:

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

示例 2:

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

\color{green}{pre指針的作用抠藕,保證了dummy指向無重復(fù)的頭指針,說不清楚}

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        dummy = pre = ListNode(0)
        dummy.next = head
        while head and head.next:
            if head.val == head.next.val:
                while head and head.next and head.val == head.next.val:
                    head.next = head.next.next
                head = head.next
                pre.next = head
            else:
                head = head.next
                pre = pre.next 
        return dummy.next
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒋困,一起剝皮案震驚了整個濱河市盾似,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雪标,老刑警劉巖零院,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異村刨,居然都是意外死亡告抄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門烹困,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玄妈,“玉大人,你說我怎么就攤上這事髓梅∧怛撸” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵枯饿,是天一觀的道長酝锅。 經(jīng)常有香客問我,道長奢方,這世上最難降的妖魔是什么搔扁? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蟋字,結(jié)果婚禮上稿蹲,老公的妹妹穿的比我還像新娘。我一直安慰自己鹊奖,他們只是感情好苛聘,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著忠聚,像睡著了一般设哗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上两蟀,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天网梢,我揣著相機與錄音,去河邊找鬼赂毯。 笑死战虏,一個胖子當著我的面吹牛拣宰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播活烙,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼徐裸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了啸盏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤骑祟,失蹤者是張志新(化名)和其女友劉穎回懦,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體次企,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡怯晕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缸棵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舟茶。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖堵第,靈堂內(nèi)的尸體忽然破棺而出吧凉,到底是詐尸還是另有隱情,我是刑警寧澤踏志,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布阀捅,位于F島的核電站,受9級特大地震影響针余,放射性物質(zhì)發(fā)生泄漏饲鄙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一圆雁、第九天 我趴在偏房一處隱蔽的房頂上張望忍级。 院中可真熱鬧,春花似錦伪朽、人聲如沸轴咱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗦玖。三九已至,卻和暖如春跃脊,著一層夾襖步出監(jiān)牢的瞬間宇挫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工酪术, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留器瘪,地道東北人翠储。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像橡疼,于是被迫代替她去往敵國和親援所。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容