這里寫目錄標題
- 一、19. 刪除鏈表的倒數第 N 個結點
- 二、21. 合并兩個有序鏈表
- 三、24. 兩兩交換鏈表中的節點
一、19. 刪除鏈表的倒數第 N 個結點
提示
中等
給你一個鏈表,刪除鏈表的倒數第 n 個結點,并且返回鏈表的頭結點。
輸入:head = [1,2,3,4,5], n = 2
輸出:[1,2,3,5]
示例 2:
輸入:head = [1], n = 1
輸出:[]
示例 3:
輸入:head = [1,2], n = 1
輸出:[1]
class ListNode:def __init__(self, data, _next=None):self.data = data #數據域self.next = _next #指針域class Solution:def removeNthFromEnd(self, head: ListNode, n: int):pre = ListNode(0, head) # 偽頭節點fast = pre # 快指針,領先慢指針n+1個節點,初始為prefor _ in range(n + 1):fast = fast.next # 后移快指針,使得快指針領先慢指針n+1個節點slow = pre # 慢指針,用于定位要刪除節點的前一個節點# 當快指針到達鏈表末尾時,慢指針到達要刪除節點的前一個節點while fast:fast = fast.nextslow = slow.nextslow.next = slow.next.next # 將刪除節點的前一個節點的next指向刪除節點的后一個節點,即刪除了節點return pre.next
二、21. 合并兩個有序鏈表
簡單
將兩個升序鏈表合并為一個新的 升序 鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。
示例 1:
輸入:l1 = [1,2,4], l2 = [1,3,4]
輸出:[1,1,2,3,4,4]
示例 2:
輸入:l1 = [], l2 = []
輸出:[]
示例 3:
輸入:l1 = [], l2 = [0]
輸出:[0]
思路:遞歸解法
算法流程:
初始化: 偽頭節點 dum ,節點 cur 指向 dum 。
循環合并: 當 l1或者l2為空時跳出
a 當l1.val<l2.val時:cur的后繼節點指定l1,并且l1向前走一步
b 當l1.val>l2.val時:cur的后繼節點指定l2,并且l2向前走一步
c 節點cur向前走一步,即cur=cur.next
合并剩余尾部: 跳出時有兩種情況,即 l1為空或者l2為空
a 若l1 != null為空 將 l1添加至節點cur后.
b 否則:將l2添加至節點cur之后
返回值:合并鏈表在偽頭節點dum之后,因此返回dum.next即可.
class Solution3:def mergetwolists(self,list1,list2):cur=dum=ListNode(0)while list1 and list2:if list1.val>list2.val:cur.next=list2else:cur.next=list1cur=cur.nextif list1:cur.next=list1elif list2:cur.next=list2return dum.next
l1 = [1,2,4]
l2 = [1,3,4]
S=Solution3()
print(S.mergetwolists(l1, l2))
三、24. 兩兩交換鏈表中的節點
中等
2.1K
相關企業
給你一個鏈表,兩兩交換其中相鄰的節點,并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題(即,只能進行節點交換)。
示例 1:
輸入:head = [1,2,3,4]
輸出:[2,1,4,3]
示例 2:
輸入:head = []
輸出:[]
示例 3:
輸入:head = [1]
輸出:[1]
思路:
class Solution:def swapPairs(self,head:ListNode):dummp = ListNode(0)cur=dummpdummp.next=head#存在一對可交換的節點條件:cur.next與cur.next.nextwhile cur.next and cur.next.next:A=cur.nextB=cur.next.nextcur.next=BA.next=B.nextB.next=Acur=cur.next.nextreturn dummp.next