前言
这里属于单链表的一些进阶题目,如果之前题目都能熟练掌握的话,说明你单链表的代码能力基本问题是不大了,缺的只有做的的逻辑思路了,接下来博主会为大家再带来四道单链表的题目,帮助你在手撕代码的道路上更上一层!!!
题目
序号 | 题目 | 难度 | 链接 | 方法 |
---|---|---|---|---|
1 | 环形链表 | 中等 | LeetCode | 快慢双指针 |
2 | 复杂链表的拷贝 | 中等 | LeetCode | 侵入式复制 |
3 | 链表的有序排序 | 中等 | LeetCode | 哨兵位结点+插入 |
4 | 删除链表中重复结点 | 中等 | 牛客网 | 三指针 |
这个题属于之前环形链表的进阶,因为注意题目要求是需要返回入环结点的!!!,所以不仅需要用到快慢指针,还需要其他的一些求解办法找到入环结点。不知道小伙伴们是否还记得如何判断单链表是否为环形的求解方法呢?
上图清晰的表述了是否为环形链表的求解思路。但是入环结点的寻找该如何解决呢?博主在这里为大家提供一个思路,如下:
这样这道题目就以一种非常的简单的方式实现出来了,代码如下:
typedef struct ListNode Node;
struct ListNode *detectCycle(struct ListNode *head)
{
if (head == NULL || head->next == NULL)
return NULL;
Node* fast = head;
Node* slow = head;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if (slow == fast)
break;
}
if (fast == NULL || fast->next == NULL)
return NULL;
while (fast != head)
{
fast = fast->