leetCode-0142_环形链表II

题目描述

英文题目

Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

Note: Do not modify the linked list.

Follow up:
Can you solve it without using extra space?

中文题目

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

说明:不允许修改给定的链表。

进阶:
你是否可以不用额外空间解决此题?

解决方法

方法一
  • 描述

    还是要设快慢指针,不过这次要记录两个指针相遇的位置,当两个指针相遇了后,让其一指针从链表头开始,此时再相遇的位置就是链表中环的起始位置

  • 源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/**
创建环

@return 环
*/
struct ListNode *create_cycle_list()
{
SingleLinkListNode *node1 = (SingleLinkListNode *)malloc(sizeof(SingleLinkListNode));
node1->val = 1;

SingleLinkListNode *node2 = (SingleLinkListNode *)malloc(sizeof(SingleLinkListNode));
node2->val = 2;

SingleLinkListNode *node3 = (SingleLinkListNode *)malloc(sizeof(SingleLinkListNode));
node3->val = 3;

SingleLinkListNode *node4 = (SingleLinkListNode *)malloc(sizeof(SingleLinkListNode));
node4->val = 4;

node1->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = node2;

return node1;
}

/**
环形链表II

@param head 不带头结点
@return 入环的第一个节点
*/
struct ListNode *detectCycle(struct ListNode *head)
{
struct ListNode *fast = head;
struct ListNode *slow = head;

while (fast != NULL && fast->next->next != NULL) {
fast = fast->next->next;
slow = slow->next;

if (fast == slow) {
fast = head;
while (fast != slow) {
fast = fast->next;
slow = slow->next;
}
return fast;
}
}
return NULL;
}


/**
环形链表II 测试
*/
void detectCycle_test()
{
printf("========环形链表II测试========\n");

SingleLinkListNode *cycleHead = create_cycle_list();
SingleLinkListNode *firstNode = detectCycle(cycleHead);
printf("入环的第一个节点值:%d\n",firstNode->val);
}

题目来源

Linked List Cycle II

环形链表 II

线性表相关代码

数据结构-线性表