感觉题又有些难了,生活没有那么简单

(1)Remove Nth Node From End of List

解题思路:

题目要求只使用一次遍历。可以使用指针来完成单程解决方案。快速移动一个指针向前移动n + 1个位置,以保持两个指针之间的间隙,然后以相同的速度移动两个指针。

最后,当快速指针到达结束时,慢指针将在n + 1个位置后面 - 只是正确的点,以便能够跳过下一个节点。

代码如下:

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) { val = x; }
 7  * }
 8  */
 9 public class Solution {
10     public ListNode removeNthFromEnd(ListNode head, int n) {
11         ListNode start = new ListNode(0);
12         ListNode fast = start, slow = start;
13         slow.next = head;
14
15         for (int i = 1; i <= n+1; i++) {
16             fast = fast.next;
17         }
18
19         while (fast != null) {
20             slow = slow.next;
21             fast = fast.next;
22         }
23
24         slow.next = slow.next.next;
25         return start.next;
26     }
27 }

(2)Linked List Cycle

解题思路:

使用快慢引用的思路。两个引用都指向链表头,从链表头开始遍历,慢引用每次前进一步,而快引用每次前进两步,如果链表是有环路的,那么快引用终将追上慢引用;如果没有环路,那么遍历就会有结束的时候

代码如下:

 1 /**
 2  * Definition for singly-linked list.
 3  * class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) {
 7  *         val = x;
 8  *         next = null;
 9  *     }
10  * }
11  */
12 public class Solution {
13     public Boolean hasCycle(ListNode head) {
14         if (head == null) {
15             return false;
16         }
17
18         ListNode fast, slow;
19         fast = head;
20         slow = head;
21         while (fast.next != null && fast.next.next != null) {
22             slow = slow.next;
23             fast = fast.next.next;
24             if(fast == slow) {
25                 return true;
26             }
27         }
28         return false;
29     }
30 }

(3)Remove Linked List Elements

解题思路:简单明了,遍历整个链表,遇到相应值得节点删掉即可。

代码如下:

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) { val = x; }
 7  * }
 8  */
 9 public class Solution {
10     public ListNode removeElements(ListNode head, int val) {
11         ListNode dummy = new ListNode(0);
12         dummy.next = head;
13         head = dummy;
14         while (head.next != null) {
15             if (head.next.val == val) {
16                 head.next = head.next.next;
17             } else {
18                 head = head.next;
19             }
20         }
21         return dummy.next;
22     }
23 }

(4)Intersection of Two Linked Lists

解题思路:

1,获取两个列表的长度。2,将它们对齐到相同的起点。3,将它们一起移动,直到找到交点,或者结束null

代码如下:

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) {
 7  *         val = x;
 8  *         next = null;
 9  *     }
10  * }
11  */
12 public class Solution {
13     public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
14         int lenA = length(headA);
15         int lenB = length(headB);
16         // move headA and headB to the same start point
17         while (lenA > lenB) {
18             headA = headA.next;
19             lenA--;
20         }
21         while (lenA < lenB) {
22             headB = headB.next;
23             lenB--;
24         }
25         // find the intersection until end
26         while (headA != headB) {
27             headA = headA.next;
28             headB = headB.next;
29         }
30         return headA;
31
32     }
33     private int length (ListNode node){
34         int length = 0;
35         while (node != null) {
36             node = node.next;
37             length++;
38         }
39         return length;
40     }
41 }

时间: 2024-11-07 01:19:26

感觉题又有些难了,生活没有那么简单的相关文章

生活小趣味-简单抽奖

路过商场,看过抽奖感觉挺有意思的,商场进行抽奖活动,三个奖项,一等奖的概率1/10,二等奖的概率的3/10,三等奖的概率是6/10,具体奖品我没仔细看,回来随便练手了一下,思考了一下,奖品分为10份,生成一个随机数,如果0-5则是三等奖,6-8是二等奖,9是一等奖,简单实现如下: int randomNumber=arc4random()%10; if (randomNumber>=0&&randomNumber<=5) { [self alert:@"恭喜你获得三等

Codeforces水题(C. Registration system map容器的简单应用)

AC代码: 用map容器做很简单 貌似用map容器的话,没有说明之前每个string对应的int都是0:再有就是这题里判断map里的元素是否重复,如果有重复的话那m[ch]对应的整型值就!=0(不等于0),还没有重复的话对应的整型值就等于0了. 原文地址:https://www.cnblogs.com/programming123/p/10807636.html

leetcode_17题——Letter Combinations of a Phone Number(简单题)

这道题要求手机上,不同的数字所对应的字母的组合,就是一步步往上求就可以了,可能有点类似于动态规划的 先求解子问题,再求出总的 #include<iostream> #include<vector> #include <map> #include<string> using namespace std; static string str[10]={"0","1","abc","def&qu

hdu1021 数学题 并不是说难,而是数学题那种简单朴素的思想get不到

hdu1021 Fibonacci Again 一个斐波那契数列,求f[n]能否被3 整除. #include<stdio.h> int main() { long n; while(scanf("%ld",&n) != EOF) if (n%8==2 || n%8==6) printf("yes\n"); else printf("no\n"); return 0; } #include <iostream> #

保持生活斗志的20种经典方法

引导语:很多时候,我们决定要做去一件事情时,不是半途而废就是三分钟热度,很多年轻人都意识到自己三分钟热度的状态而无法改变,最终也大部分一事无成,保持生活斗志的20种经典方法,让你的三分钟热度沸腾. 1.离开舒适区:不断寻求挑战激励自己.提防自己,不要躺倒在舒适区.舒适区只是避风港,不是安乐窝.它只是你心中准备迎接下次挑战之前刻意放松自己和恢复元气的地方. 2.把握好情绪:人开心的时候,体内就会发生奇妙的变化,从而获得阵阵新的动力和力量.但是,不要总想在自身之外寻开心.令你开心的事不在别处,就在你

POJ百道水题列表

以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight Moves1101 Gamblers1204 Additive equations 1221 Risk1230 Legendary Pokemon1249 Pushing Boxes 1364 Machine Schedule1368 BOAT1406 Jungle Roads1411 Annive

软考之下午题

今年的软考刚刚进行完,趁着刚考完还有热乎劲,想把这些有关于软考的只是来总结一下.今天咱们来讨论下午题的做法. 软考分为上午题和下午题,上午题也就是75个选择题,属于基础只是这一块内容,而下午题则是5个答题,属于应用知识部分.上午题的做法,就是做题,然后分析,对于做过的题,要保证每一个选项都知道是什么情况,因为这次考试这个,下次就考试那个.而下午题呢,则需要一定的技巧. 我们先来看一张图 在上面的思维导图中,我给出了下午题要考查的5大知识点以及在每个题目中大概会让你做些什么.然后我们来看个人做题过

用Matlab解《2013年数据建模比赛》图像碎片拼接题

摘要: matlab,数学建模,碎片拼接 额,最近抠c++抠累了,突然心血来潮翻看近年来的大学生数学建模题.相比当年参加比赛的题目,总体感觉现在的题目越来越接近生活了.可能是多了一些经历,对一些题特别有感觉,加之联想起以前做完一道难题得到的兴奋感,一个想法涌上心头,为什么不利用现在的知识来好好“收拾收拾”它们呢.因此便有了这篇的文章,一方面是分享下自己的想法,另外也是锻炼下自己的文笔,身为程序猿,是时候改变一下一些习惯了.选出特别感兴趣的题目<2013年数学建模B赛题-图像碎片拼接>,开弄!

一天一道算法题--5.25--bfs或者最短路

好吧 还是拖到了5.26来写本是5.25的题... 自我 宽恕 老样子---  感谢    微信平台: 一天一道算法题   无聊的你 也可以去关注一下 题目 链接:http://poj.org/problem?id=3126 题目 大意:  给你2个素数 问从一个素数到另一个转换的过程中  每次只允许改变一个位上的数 并且在改动过程中 保证它也是素数  最少需要多少次实现这个转换? ok 其实 这题 不算难  当告诉你这是个搜索以后  只是在进行个位 十位 百位 千位 上各个数字尝试的时候 可能