- 博客(16)
- 资源 (4)
- 收藏
- 关注
原创 [Leetcode 138] Copy List with Random Pointer
题目 复制带有随机指针的链表:一个单链表除了next指针外还有一个random指针随机指向任何一个元素(可能为空) 《剑指offer》上的面试题26分析代码
2015-07-27 10:42:21 1599
原创 [Leetcode 160] Intersection of Two Linked Lists
题目 给定两个链表,求两个单链表的交点。要求时间复杂度为O(n),空间复杂度为O(1)分析代码采用方法二/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {
2015-07-27 09:51:43 372
原创 [Leetcode 142] Linked List Cycle II
题目 不用额外的空间,返回单链表中环的入口。分析 利用快慢指针的方法判断该单链表是否有环,一个指针从快慢指针相遇的位置,一个指针从链表头结点位置,同时每次移动一步,在两个指针相遇的地方就是单链表环的入口推导 代码/** * Definition for singly-linked list. * struct ListNode { * int val; * Lis
2015-07-26 20:19:25 269
原创 [Leetcode 141] Linked List Cycle
题目判断单链表里是否有环分析 用两个指针P1和P2,P1每次走一步,P2每次走两步,如果链表中有环,两个指针一定会在环中相遇。代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x)
2015-07-26 19:55:29 317
原创 [Leetcode 234] Palindrome Linked List
题目 判断一个单向链表是否是回文链表,要求在O(n)的时间复杂度,O(1)的空间复杂度。分析 方法一:利用栈先进后出的性质,将链表的前半段压入栈中,在逐个弹出与链表后半段比较,时间复杂度O(n),但需要n/2的栈空间,空间复杂度为O(n); 方法二:翻转链表法,将链表后半段原地翻转,再将前半段、后半段依次比较,判断是否相等,时间复杂度为O(n),空间复杂度为O(1),满足题目要求。
2015-07-26 19:27:01 377
原创 查找单链表的中间节点
因为单链表只能向后查找的原因,查找单链表的中间节点,最一般的解法是,先遍历一次链表得到链表的长度,然后再遍历一半链表,得到链表中间元素。 还有一种比较机智的办法是,利用快慢指针,设两个指针,一个指针每次走一步,一个指针每次走两步,当每次走两步的指针到达链表尾部的时候,每次走一步的指针刚好到达链表中间。Node * findMiddleNodeOfLinedList(Node *head){
2015-07-26 17:18:15 450
原创 [Leetcode 25] Reverse Nodes in k-Group
题目分析 1. 方法一:题目中提到可以采用常数量个空间,所以想到了,采用一个大小为k的数组空间来存储group值,然后利用遍历k步前记录的链表起始地址,来修改这个k-Group链表的值。(修改的是链表中存储的值,而非链表指针) 2. 方法二:先遍历k步,记录k-Group链表的起始地址,和终止地址,然后调用一个链表翻转的子函数,对这个记录下起始地址和终止地址的链表翻转操作。(需要遍历两遍链
2015-07-26 16:39:50 318
原创 237、Delete Node in a Linked List [Leetcode]
题目 给定单链表的一个节点(不是最后一个节点),请删除它分析 没有表头,如何找到这个节点的前一个节点? 方法:采用“懒删除”,当前节点复制下一个节点的内容,然后删除下一个节点C代码/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *n
2015-07-25 18:45:33 320
原创 206、Reverse Linked List [Leetcode]
题目描述分析 思路:把当前节点作为已经翻转结果的新表头节点C代码/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* reverseList(struct ListNode* h
2015-07-25 18:33:37 309
原创 92、Reverse Linked List II [Leetcode]
Reverse Linked List II 题目描述 在链表原位置上,翻转位置m到n上的结点,指遍历链表一次分析 如何找到第m个元素和第n个元素 如何处理前面和后面 1.保存前面部分最后一个元素 2. 保存后面部分第一个元素 3. 特殊情况都有哪些:是否需要修改头指针C代码/** * Definition for singly-linked list. *
2015-07-25 18:18:31 323
原创 31. 连续子数组的最大和
题目描述 输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间负责度为O(n)。解析 1. 解法一: 看到这个题目,我们首先想到的是求出这个整型数组所有连续子数组的和,长度为n的数组一共有 n(n+2)/2个子数组,因此要求出这些连续子数组的和最快也需要O(n^2)的时间复杂度。但是题目要求的O(n)的时间复杂度,因此上述思路不
2015-07-24 16:23:25 439
原创 38. 数字在排序数组中出现的次数
题目描述 统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3, 由于3在这个数组中出现了4次,因此输出4.解析 1. 解法一: 该解法是最直观的解法,可以先使用二分查找先找到这个元素,然后分别向左和向右遍历,把左右相同的元素的个数都计算出来。 该方法很直观,当算法的效率太低。 2.解法二: 可以将
2015-07-20 16:33:15 332
原创 24. 二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该整数数组是不是某二叉搜索树的后序遍历的结果,如果是则返回true,否则返回false。假设输入数组的任意两个数字都互不相同解析 在后序遍历得到的序列中,最后一个数字是树的根结点的值。数组中前面的数字可以分为两部分:第一部分是左子树结点的值,它们都比根结点的值小,第二部分是右子树结点的值,它们都比根结点的值大。主要代码实现bool V
2015-07-20 16:29:14 361
原创 8. 旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 解析 1. 递增数组的旋转,例如,数组{1 2 3 4 5},经过旋转可以是{2 3 4 5 1},{3 4 5 1 2},{1 2 3 4 5},{
2015-07-19 15:07:41 313
原创 6. 重建二叉树
题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。解析 根据先序遍历和中序遍历还原二叉树的主要思想: 1、先序遍历序列的第一个元素必定是根节点,可以由此获
2015-07-19 12:30:10 334
原创 实现两个N*N矩阵的乘法 矩阵用一维数组表示
简介注意下标 和 参数的传递。用一维数组存储二维数组,编程时候注意元素下标。实现代码//N*N矩阵相乘void NmultiplyNmatrix( int *A, int *B, int *C, int N){ for( int i=0; i<N; i++) { for( int j=0; j<N; j++) {
2015-07-15 17:46:38 1152
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人