#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小的結點,另乙個鍊錶儲...