1. 链表相交
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode pA = headA; ListNode pB = headB; while(pA != pB) { pA = pA == null ? headB : pA.next; pB = pB == null ? headA : pB.next; } return pA; } }
|
一开始就是这么想的,但是很麻烦,想不下去了(麻了):
https://www.programmercarl.com/ 面试题 02.07. 链表相交.html# 其他语言版本
2. 环形链表 II
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class Solution { public ListNode detectCycle(ListNode head) { ListNode fast = head; ListNode slow = head; if(fast == null || fast.next == null) return null; while(fast != null && fast.next != null) { fast = fast.next.next; slow = slow.next; if(fast == null || fast.next == null) return null; if(fast == slow) break; } fast = head; while(fast != slow) { fast = fast.next; slow = slow.next; } return fast; } }
|
数学题:(x + y) * 2 = x + y + n (y + z)