1、删除链表中的倒数第n个结点。
思路很简单:就是先知道总共有几个链表结点,然后计算出要删除元素正着数是第几个元素,知道这一点就简单了,因为它是个单向链表,从表头开始遍历就可以了。
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
if head.next == None and n==1:
head = None
else:
p = head
count =0
while(p!=None):
p = p.next
count +=1 #此时的count得到的数是几个数
p = head
if count == n:
head = head.next
else:
for i in range(0,count-n-1):
p = p.next
p.next = p.next.next
return head
head = [1,2]
n =2
p = ListNode()
q = ListNode()
h = p
for i in range(0,len(head)-1):
p.val = head[i]
p.next = q
p = q
q =ListNode()
p.val = head[-1]
p.next = None
p = h
while(p !=None):
print(p.val)
p= p.next
a = Solution().removeNthFromEnd(h,2)
p = h
while(p !=None):
print(p.val)
p= p.next
2.合并两个有序链表
两个有序链表的合并,跟两个有序数组的差不多但是它不用新创建数组空间,
黑色是原来链表的顺序,红色是合并后的顺序。
思路:两个指针指向链表1和链表2的表头,然后比较这两个指针所指向元素值的大小,把小的放下新链表的末尾,然后指针指向下一个元素,直到两个链表全放进新链表。
from typing import Optional
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def mergeTwoLists(self, list1: ListNode, list2:ListNode) -> ListNode:
p = list1
q = list2
head = ListNode()
o = head
while(p!=None and q!=None):
if q.val<p.val:
o.next = q
o = q
q = q.next
else:
o.next = p
o = p
p = p.next
while(p!=None):
o.next = p
o = p
p = p.next
while(q!=None):
o.next = q
o = q
q = q.next
head = head.next
return head
l1 = [1,2,4]
l2 = [1,3,4]
p = ListNode()
q = ListNode()
h1 = p
for i in range(0,len(l1)-1):
p.val = l1[i]
p.next = q
p = q
q =ListNode()
p.val = l1[-1]
p.next = None
p = ListNode()
q = ListNode()
h2 = p
for i in range(0,len(l2)-1):
p.val = l2[i]
p.next = q
p = q
q =ListNode()
p.val = l2[-1]
p.next = None
a = Solution().mergeTwoLists(h1,h2)
print(a)