- 博客(8)
- 收藏
- 关注
原创 剑指offer 52. 两个链表的第一个公共结点
1.问题描述输入两个链表,找出它们的第一个公共结点。说明:应该是两个单向链表,成Y字型,不会成X型,也不会成环。2.解决思路链表只能从表头单向访问,可以利用栈的后进先出特性来实现,把两个链表压入栈再弹出来,但是那样需要两个辅助栈,如果两条链表的长度分别是m和n,则需要m+n个辅助栈空间,同时时间复杂度为O(m+n)。使用两个指针:先遍历计算链表的长度,让长链表的指针先走| m-...
2018-09-17 11:04:29 207
原创 剑指offer 23. 链表中环的入口
1.问题描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。2.解决思路2.1 思路11)先判断链表是否有环;2)如果有环,假设环里面有n个结点,除去环之外有m个结点,使用快慢指针fast和slow,开始都指向头结点head,每次移动一个结点: 设fast指针先走x了步,我们希望slow指针从1结点经过m步到达第m+1个结点(即环入口)的时候...
2018-09-16 23:37:02 122
原创 剑指offer 25. 合并两个排序的链表
1.问题描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。2.解决思路1)非递归的方法 如果可以改变链表,直接从头结点开始依次移动比较两个链表当前值的大小,把较小的值作为当前结点的下一个结点。 注意:刚刚开始的时候不知道头结点到底是1的还是2的,所以新建一个额外的新节点作为辅助: ListNode *first =...
2018-09-16 21:37:11 98
原创 剑指offer 22. 链表中倒数第k个结点
1.问题描述输入一个链表,输出该链表中倒数第k个结点。2.解决思路由于链表只能从头结点开始遍历,所以我们需要知道链表总共有多少个结点,需要遍历一次知道长度n;1)使用一个指针,遍历链表两次: 第一次:遍历一次得到链表的长度n; 第二次:需要打印出倒数第k个,也就是正数的第n-k+1个;2)使用两个指针,遍历链表一次: 第一个指针node1:先走x步...
2018-09-14 17:18:09 130
原创 剑指offer 附加1. 删除链表中的重复结点
1.问题描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5.2.解决思路1)链表为空,无重复;2)链表只有一个结点,不存在重复;3)链表有2个以上结点:考虑头结点是否会被删除的特例 a)为了防止头结点...
2018-09-14 15:46:19 115
原创 剑指offer 24. 反转链表
1.问题描述输入一个链表的头结点,反转链表后,输出新链表的表头。2. 解决思路 1)链表是空的:直接返回空的头结点; 2)链表中只有一个结点:直接返回原头结点; 3)链表中有大于2个以上的结点:需要三个指针来辅助 a)头结点的下一个结点为空结点NULL; b)要对每个结点逐一遍历并反转,需要辅助指针node1来遍历; c)由于需要改变每个结点...
2018-09-13 21:49:28 115
原创 链表节点的增加和删除
链表是一种动态的数据结构,因为在创建链表时,不需要知道链表的长度,只需要对指针进行操作。1. 链表的定义struct ListNode{ int val; ListNode* next; ListNode(int x) : val(x), next(NULL){}};2. 在链表的末尾增加一个节点解决思路:分原来的链表是空链表和非空链表的情况;特别注意:函数的第一个...
2018-09-13 12:11:59 14342 2
原创 剑指offer 06. 从尾到头打印链表
1.问题描述输入一个链表的头结点,按链表值从尾到头的顺序返回一个ArrayList。2. 解决思路由于是反向打印,所以是一个“后进先出”的问题,使用栈来解决,虽然递归的本质就是一个栈结构,但是当链表非常长的时候,函数调用的层级很深,可能会导致函数调用栈溢出,鲁棒性不够好。3. 代码实现1)基于栈的代码实现如下:/*** struct ListNode {* ...
2018-09-13 11:57:24 136
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人