1. 链表相交

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

图示两个链表在节点 c1 开始相交:

I1Fwb.png

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构

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 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

I1nDg.png

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)(不写这个公式,不推理一番基本做不出来)

IeQMN.gif

数学题:(x + y) * 2 = x + y + n (y + z)

Ie0HL.png

Edited on Views times

Give me a cup of [coffee]~( ̄▽ ̄)~*

deku酱 WeChat Pay

WeChat Pay

deku酱 Alipay

Alipay

deku酱 PayPal

PayPal