LeetCode 鍊錶(19,21,23,24)

2021-09-16 23:15:54 字數 2917 閱讀 8996

#no.19 刪除鍊錶的倒數第n個節點

「」"「」"

def remove_nth_fomr_end(head, n):

tail = head

previous = head

prior = head

i = 1

while i < n and tail.next:

tail = tail.next

i += 1

if i == n:

while tail.next:

prior = previous

previous = previous.next

tail = tail.next

print(id(head), id(prior), id(previous), id(tail))

if head is previous:

head = previous.next

else:

prior.next = previous.next

return head

「」"方法一:感覺思路清晰,但是**有冗餘。不夠簡潔。

「」"「」"

以下是方法二:

「」"def remove_nth_fomr_end(head, n):

first = second = head

for _ in range(n): #給定n確認正確,直接遍歷即可。

first = first.next

if not first: #倒數第乙個

return head.next

while first.next: #存在時,用雙next表示空乙個。刪除乙個。

first = first.next

second = second.next

second.next = second.next.next

return head

「」"21. 合併兩個有序鍊錶

1->2->4, 1->3->4

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

「」"""

class solution:

def mergetwolists(self, l1: listnode, l2: listnode) -> listnode:

head = dummy = listnode(-1) #注意這個寫法。直接用.next取listnode(0)

while l1 and l2:

if l1.val < l2.val:

head.next = l1

l1 = l1.next

else:

head.next = l2

l2 = l2.next

head = head.next

if l1:

head.next = l1

if l2:

head.next = l2

return dummy.next

#方法二:

class solution:

def mergetwolists(self, l1: listnode, l2: listnode) -> listnode:

if not l1 or not l2: #用or判斷簡寫

return l1 or l2

if l1.val < l2.val: #判斷然後用迭代的方式,一層一層的加。

l1.next = self.mergetwolists(l1.next, l2)

return l1

else:

l2.next = self.mergetwolists(l1, l2.next)

return l2

「」"23. 合併k個排序鍊錶

輸入:[

1->4->5,

1->3->4,

2->6

]輸出: 1->1->2->3->4->4->5->6

相當於21的公升級版

「」"""

#第一種方法:總體是思路是借用21題兩個鍊錶排序方式,用遞迴的方式兩兩和並。

class solution:

def mergeklists(self, lists: list[listnode]) -> listnode:

amount = len(lists)

interval = 1

while interval < amount:

for i in range(0, amount - interval, interval * 2):

lists[i] = self.merge2lists(lists[i], lists[i + interval])

interval *= 2

return lists[0] if amount > 0 else lists

def merge2lists(self,l1,l2):

head = point = listnode(0)

while l1 and l2:

if l1.val <= l2.val:

point.next = l1

l1 = l1.next

else:

point.next = l2

l2 = l2.next

point = point.next

if not l1:

point.next = l2

else:

point.next = l1

return head.next

#第二種方式: 列表放入遍歷出的排序後,轉成鍊錶

「」"24. 兩兩交換鍊錶中的節點

你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。

示例:給定 1->2->3->4, 你應該返回 2->1->4->3.

#二種寫法其實思路差不多。就是對比學習一下。表達方式。

#相對來說第二種比較好理解。

leetcode 鍊錶 回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?head null 空鍊錶,回文,返回true head.next null 只有乙個節點的列表,回文,返回tru...

leetcode 鍊錶 回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2輸出 false示例 2 輸入 1 2 2 1輸出 true高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?思路 利用快慢指標找到中間節點,當快指標走到末尾時,慢指標指向中間節點 交中間節點之後的節點進行鍊錶反轉 設定指標p1從h...

分隔鍊錶(鍊錶 LeetCode)

題目鏈結 給你乙個鍊錶和乙個特定值 x 請你對鍊錶進行分隔,使得所有小於 x 的節點都出現在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。示例 輸入 head 1 4 3 2 5 2,x 3 輸出 1 2 2 4 3 5維護兩個鍊錶,乙個鍊錶儲存比x小的結點,另乙個鍊錶儲...