链表(2)

案例1
给定一个整数num,如何在节点值有序的环形链表中插入一个节点值为num的节点,且保证这个环形单链表依然有序。
解法:时间复杂度O(N),额外空间复杂度O(1)。
这里写图片描述

这里写图片描述
插入node,返回head即可。
这里写图片描述

3.若p和c转一圈都没发现应插入的位置(该节点比整个链表都大或都小),此时node应插入头结点的前面。
若节点值最小,头结点应返回该节点;若节点值最大,头结点应返回原头节点。

案例2
给定一个链表中的节点node,但不给定整个链表的头结点。如何在链表中删除node?请实现这个函数,要求时间复杂度O(1)
分析:双链表很容易
单链表思路:
这里写图片描述
2的值变为3的值,然后删掉节点3该思路问题:
1.无法删除最后一个节点
如图,节点3没法删除
这里写图片描述
这里写图片描述

案例3
给定一个链表的头节点head,再给定一个数num,请把链表调整成节点值小于num的节点都放在链表左边,值等于num的节点都放在链表中间,值大于num的节点都放在链表右边。

简单做法:
1.将链表所有节点放入到数组中,然后将数组进行快速划分的调整过程。
2、将数组中的节点依次重新串联。

最优解为,将大链表拆成3个小链表(大于,小于,等于),最后再把链表重新组合在一起。该法没有额外空间复杂度,但易出错。

案例4
给定两个有序链表头结点head1和head2,打印两个有序链表的公共部分。
分析:
1.若两个链表有任何一个为空,直接返回即可。
2.不为空,就遍历。
这里写图片描述
若c1小,c1向下一个,再比较。
若c2小,c2向下一个,再比较。相同值,打印出来。c1和c2都向下移动。
两个表有一个到空,过程截止。

案例5
给定一个单链表的头结点head,实现一个调整单链表的函数,使每K个结点之间逆序,若最后不够K个节点一组,则不调整最后几个节点。
例:1 2 3 4 5 6 7 8 k=3
调整为3 2 1 6 5 4 7 8
分析:1.链表为空,为1或2,链表不用进行调整。
链表长度为n
方法1:时间复杂度为O(n),额外空间复杂度为O(k)
利用栈处理
栈的弹入弹出就是逆序的过程,每k个数入栈。
难点:最后一组不足k的处理,next指针的切换。
第一组需要特殊处理。

方法2:时间复杂度为O(n),额外空间复杂度为O(1)
法2与法1类似,但省去栈的结构,需要更多的边界讨论及代码实现技巧。

案例6
给定一个单链表的头节点head,再给定一个数val,把等于val的节点删掉。
分析:即重新建立链表的过程,需要val的值,就删掉跳至下一节点。
需要考虑好种种边界条件问题。

案例7
判断一个链表是否为回文结构
例:12321 true
1231 false

方法1,时间复杂度为O(n),额外空间复杂度为O(n)
申请个栈,把链表的数都压入栈中。
再次遍历链表,并每个都弹出一个栈的值,进行比较。都相等,true。

方法2,时间复杂度为O(n),额外空间复杂度为O(n/2)
利用栈,前一半压入,后一半弹出并进行比较。
奇数节点数,不考虑中间点。

方法3,时间复杂度为O(n),额外空间复杂度为O(1)
1.找到中间节点
这里写图片描述

2.右半部分逆序
这里写图片描述
3.从链表两头依次对比。
这里写图片描述
PS:返回之前,需要把链表的结构调整回来。

案例8
这里写图片描述

分析:1.链表为空,直接返回空
2.若不为空,原链表节点间插入指针。
这里写图片描述
再次遍历链表,同时拿到1和1’
这里写图片描述

这里写图片描述
同理
这里写图片描述
再把大链表分流成两个链表即可
这里写图片描述

案例9
如何判断一个单链表是否有环?
有环的话返回进入环的第一个节点,无环的话返回空。若链表的长度为N,请做到时间复杂度为O(N),额外空间复杂度为O(1)

无限制的话,普通法用哈希表来实现。

最优解:
快慢指针
这里写图片描述
快指针一次走两步, 慢指针一次走一步
若有环,快慢指针将在环中某一个位置相遇。
这里写图片描述
此时,快指针回到头部,一次一步走,慢指针从相遇点,一次一步走。再次相遇的点,为第一个入环节点。
这里写图片描述

案例10
如何判断两个无环单链表是否相交?相交的话返回第一个相交的节点,不相交的话返回空。若两个链表的长度分别为N和M,请做到时间复杂度为O(N+M),额外空间复杂度为O(1)

无限制的话,普通法用哈希表来实现。

最优解:
1.遍历两个链表,统计各自长度。
这里写图片描述
让长度为100的链表先走50步,接下来再一起走,若相交,在同步走的过程中一定能走到第一个相交的节点,若走到最后都没有相交,说明不相交。

案例11
如何判断两个有环单链表是否相交?相交的话返回第一个相交的节点,不相交的话返回空。若两个链表的长度分别为N和M,请做到时间复杂度为O(N+M),额外空间复杂度为O(1)

解:根据之前找环形链表第一个入环点的题目,找两个链表各自的入环节点。
这里写图片描述
若node1=node2,则入环前肯定相交,需要找第一个相交节点,做法同案例11相同,不同的是,遍历到共用入环节点即可。
这里写图片描述

若入环节点不同,只能是以下两种情况。
这里写图片描述
区分方法,链表1环的过程中,需要第2个链表的入环节点,就是情况2,没遇到就是情况1。

情况1返回空
情况2返回node1或node2都正确。

案例12
给定两个单链表头节点head1和head2,如何判断两个,链表是否相交?相交的话返回第一个相交的节点,不相交的话返回空。
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值