反转链表
def reverse(head):
q=None
p=heap
while p:
temp=p.next
p.next=q
q=p
p=temp
return p
判断链表环
def meetingnode(head):
if not head:
return
slow=head
fast=head.next
while fast and fast.next:
if fast==slow:
return slow
slow=slow.next
fast=fast.next.next
return None
环的入口
def entry(head):
meet=meetingnode(head)
if not meet:
return None
count=1
p=meet
while p.next!=meet:
p=p.next
count+=1
a=head
b=head
for i in range(count):
a=a.next
while a!=b:
a,b=a.next,b.next
return a
合并链表
#合并两个有序
class Solution:
# 返回合并后列表
def Merge(self, pHead1, pHead2):
# write code here
if pHead1==None:
return pHead2
if pHead2==None:
return pHead1
if pHead1.val<pHead2.val:
dummy=pHead1
dummy.next=self.Merge(pHead1.next,pHead2)
else:
dummy=pHead2
dummy.next=self.Merge(pHead1,pHead2.next)
return dummy
#合并多个链表,并排序
class Solution:
def mergeKLists(self, lists):
"""
:type lists: List[ListNode]
:rtype: ListNode
"""
pre = cur = ListNode(0)
heap = []
for i,j in enumerate(lists):
if j:
heapq.heappush(heap, (j.val, i, j))
while heap:
node = heapq.heappop(heap)
idx = node[1]
cur.next = node[2]
cur = cur.next
if cur.next:
heapq.heappush(heap, (cur.next.val, idx, cur.next))
return pre.next
两链表的公共节点
#计算长度
def intersection(head1,head2):
a,b=head1,head2
l1=l2=0
while a:
a=a.next
l1+=1
while b:
b=b.next
l2+=1
a,b=head1,head2
if l1>l2:
for i in range(l1-l2):
a=a.next
elif l1<l2:
for i in range(l2-l2):
b=b.next
while a!=b:
a,b=a.next,b.next
return a
#LeetCode上的简洁版
def intersection(head1,head2):
if not head1 or not head2:
return
a=head1
b=head2
while a!=b:
a=a.next if a else head2
b=b.next if b else head1
return a
奇偶链表
#奇数维节点在前,偶数位放后面,并保证顺序不变
def oddevenlist(head):
d1=odd=ListNode(0)
d2=even=ListNode(0)
i=1
while head:
if i%2:
odd.next=head
odd=head
else:
even.next=head
even=head
head=head.next
i+=1
odd.next=d2.next
even.next=None
return d1.next