七道经典的关于链表的笔试题目( 二 )

<10:l=Node()l.next=Nonel.data=ip.next=lp=li+=1cur=ListNode.next#原始的列表顺序输出while cur is not None:print(cur.data)cur=cur.nextmid=FindMiddleNode(ListNode.next)print(mid.data)#输出中间的元素将两个链表依次合并,现在有一个l1链表a->b->c,还有一个l2链表1->2->3,然后依次合并,此时合并的链表为a->1->b->2->c->3这个步骤是这样的,主要是将l1链表为主链,思想如下图所示:

七道经典的关于链表的笔试题目

文章插图
 
class Node():def __init__(self):self.data=https://www.isolves.com/it/sjk/bk/2020-09-29/Noneself.next=Noneif __name__=="__main__":one_listNode=Node()one_p=one_listNodetwo_listNode = Node()two_p = two_listNodei=1while i<=10:l=Node()l.data=il.next=Noneone_p.next=lone_p=li+=1j=11while j<=20:l=Node()l.data=jl.next=Nonetwo_p.next=ltwo_p=lj+=1one=one_listNode.nexttwo=two_listNode.nexta=Nonewhile one.next is not None:a=one.nextone.next=twoone=aa=two.nexttwo.next=onetwo=aone.next=twon=one_listNode.nextwhile n is not None:print(n.data)n=n.next找到一个链表的倒数第k个结点我们可以设置两个指针,其中一个指针领先第二个指针k个元素,当第一个指针到链表结尾了,那么第一个指针就是链表的倒数第k个结点 。这个只需要遍历一次链表,所以时间复杂度为O(N)
需要注意的是,我们需要时时刻刻地判断这个链表是否长度能够到k,如果本身就没有k个元素,那么倒数第k个元素也是没有意义的
class Node():def __init__(self):self.next=Noneself.data=https://www.isolves.com/it/sjk/bk/2020-09-29/Nonedef FindlastK(list,k):if list is None or list.next is None:returni=0klist=listfirst=list#klist比first领先3个元素while i单链表向右旋转k个位置这个意思是这样的,现在有一个单链表头结点->1->2->3->4->5->6->7,此时我们设置k=3,那么我们希望链表可以变为:头结点->5->6->7->1->2->3->4 。
这个我们可以先找到倒数第k+1个结点slow,以及原始链表的尾结点fast,然后分割为两个链表,然后进行组合就完成了单链表向右旋转k个位置
七道经典的关于链表的笔试题目

文章插图
 
class Node():def __init__(self):self.next=Noneself.data=https://www.isolves.com/it/sjk/bk/2020-09-29/NonedefRotateK(list,K):if list is None or list.next is None:returnslow=list.nextfast=list.nexti=0tmpend=Nonetmpstart=Nonewhile i<=K and fast is not None:fast=fast.nexti+=1if i
【七道经典的关于链表的笔试题目】


推荐阅读