136.只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
思路:如果直接将数组排列后寻找不成对的数字,会超出时间限制。本题采用位运算的方法,按位异或:两个相同的数字按位异或的结果为0;任何数和0按位异或结果为它本身;按位异或可结合,可交换。因此,只需要将数组里的所有元素按位异或,就可以得到只出现一次的数字。
代码如下:
public class Solution
{
public int SingleNumber(int[] nums)
{
int result=0;
for (int i = 0; i < nums.Length;i++ )
{
result ^= nums[i];
}
return result;
}
}
141.环形链表
给定一个链表,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。
思路:设置两个指针,一个指针以一个结点为单位遍历链表,另一个指针以两个结点为单位遍历链表。如果是环形链表,两个指针一定会相遇。
代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution
{
public bool HasCycle(ListNode head)
{
ListNode p1 = head;
ListNode p2 = head;
while (p1 != null && p1.next != null)
{
p1 = p1.next.next;
p2 = p2.next;
if (p1 == p2)
return true;
}
return false;
}
}
142.环形链表II
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。
说明:不允许修改给定的链表。
进阶:
你是否可以使用 O(1) 空间解决此题?
思路:采用一个Hashset集合来存储链表中的结点,一一匹配即可。
代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution
{
public ListNode DetectCycle(ListNode head)
{
HashSet<ListNode> hset = new HashSet<ListNode>();
ListNode p=head;
while (p != null)
{
hset.Add(p);
p = p.next;
if(hset.Contains(p))
return p;
}
return null;
}
}