
OJ算法-链表相关
BraveLii
这个作者很懒,什么都没留下…
展开
-
找到链表环的入口
题目描述一个链表中包含环,请找出该链表的环的入口结点。思路1、设置一对快慢指针,都从链表头出发(快指针每次走两步,慢指针每次一步)2、找到两个指针在环上的相遇点3、设置两个指针,分别从链表头和相遇点出发4、上面两个指针相遇的地方即为环入口ListNode* EntryNodeOfLoop(ListNode* pHead){ if(pHead == NULL || pHead->ne...原创 2018-03-22 17:01:36 · 527 阅读 · 0 评论 -
剑指offer-24、反转链表
题目描述输入一个链表,反转链表后,输出链表的所有元素。思路1:采用递归的方法。在递的过程中,找到最后一个节点作为链表头返回;在归的过程中,反转当前节点的下一个节点。class Solution {public: ListNode* ReverseList(ListNode* pHead) { if(pHead == NULL || pHead->next==NULL...原创 2018-05-02 06:40:07 · 202 阅读 · 0 评论 -
剑指offer-22、链表倒数第k个节点
题目描述输入一个链表,输出该链表中倒数第k个结点。思路:一个指针先提前走k-1步,然后两个指针同时走,当快指针走到最后一个节点时,慢指针就在倒数第k个节点。这道题的关键是要考虑到节点数小于k个的情况,当快指针先走的期间,如果指针为NULL,说明节点数量小于k个class Solution {public: ListNode* FindKthToTail(ListNode* pListHe...原创 2018-05-02 06:40:12 · 251 阅读 · 0 评论 -
剑指offer-6、从尾到头打印链表
题目描述输入一个链表,从尾到头打印链表每个节点的值。思路1:遍历一遍存到栈里面,然后出栈打印 vector<int> printListFromTailToHead(ListNode* head) { vector<int> node_arr; stack<int> node_stack; ...原创 2018-05-01 10:37:52 · 194 阅读 · 0 评论 -
两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。思路1:设两个链表公共的长度为s,链表1的长度为m+s,链表2的长度为n+s。两个移动指针分别从两个链表开始移动:p1: 链表1头部->走到尾部->链表2头部 ->公共结点p2: 链表2头部->走到尾部->链表1头部 ->公共结点p1走的步数为m+s+n,p2走的步数为n+s+mListNode* FindFi...原创 2018-03-21 10:59:37 · 184 阅读 · 0 评论 -
链表逆序
解法一:遍历看了其它的一些解法,都是画一排图,搞得很复杂。其实这道题就是不断的删除一个链表的头节点,再将该节点插到另一个链表的头节点之前。实现步骤:①初始化一个新链表的头节点pNewHead = NULL;②旧链表的头节点后移;③旧链表不要的节点送给新链表;④重复②typedef struct{ int data; LinkNode* next; }LinkNode; ...原创 2018-03-20 23:33:57 · 260 阅读 · 0 评论 -
链表-找到链表中倒数第k个结点
思路:定义快慢两个指针,快指针先走k-1步,然后快慢两个指针同时向前,当快指针走到最后一个节点,慢指针此时就在倒数第k个节点。按照上面的思路,会出现一个特殊情况:当链表长度小于k时,快指针在k-1步之内就会指向NULL,此时应该返回空;typedef struct{ int data; LinkNode* next; }LinkNode; LinkNode* ...原创 2018-03-21 00:28:00 · 199 阅读 · 0 评论 -
复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)步骤1、复制旧的链表,每个节点都复制一份插入当前节点之后(random指针此时不赋值)2、给新链表的random指针复制,偶数节点需要复制。random指针指向前节点randon...原创 2018-03-22 23:38:50 · 142 阅读 · 0 评论 -
剑指offer-25、合并两个有序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路1:递归的方法:比较两个链表头节点元素的大小,较小的作为合并后的节点返回,再对新的两个链表递归进行上述操作class Solution {public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { ...原创 2018-05-02 06:39:59 · 216 阅读 · 0 评论