双指针解法,本质是构造两条等长链表。假设a
长度为lenA
,b
长度为lenB
,共同长度为lenC
,补齐各自缺少对方的节点,构造出两条同样长的新链表。
则lenA + lenC + lenB = lenB + lenC + lenA
。 由于a
和b
两个走的路程是一样长的,把相交节点叫NodeC
,则a
,b
两者走到的终点就是NodeC
。其中NodeC
可以是一个节点或者null
空节点。
// A: 1 -> 2 -> 3
// -> C -> 4 -> 5 -> null
// B: 6 -> 7
// A + B: 1 -> 2 -> 3 -> C(相交点) -> 4 -> 5 -> null -> 6 -> 7 -> C(相交点) -> 4 -> 5 -> null
// B + A: 6 -> 7 -> C(相交点) -> 4 -> 5 -> null -> 1 -> 2 -> 3 -> C(相交点) -> 4 -> 5 -> null
“反转链表的一部分”跟“反转整条链表”不少操作是类似的。反转同样需要运用到三个指针pre、cur、nxt。其中pre指向当前节点的前一个节点,cur指向当前节点,nxt指向当前节点的下一个节点。利用头插法完成反转。
相对于“反转整条链表”,“反转链表的一部分”需要应用到一些性质:
特殊情况,当left为1的时候,反转部分的前一个节点是无法找到p0的,为了统一逻辑,我们引入一个虚拟头节点dummy,让dummy的next指向head。这样子我们就可以认为当left为1的时候,p0就是dummy。
三色标记法 + dfs
Trie树
四个方向dfs插旗
观察交换规律,看成上下左右,每个方向控制几个数。比如3*3的矩阵,上下左右分别控制2个数。t, b, l, r 指针围成一个圈,t控制上,b控制下,l控制左,r控制右。比如:
。
可以看成是t控制了第一排前两个数(1, 2),r控制了最后一列的前两个数(3, 6)。b控制了最后一排从右数的两个数(9, 8),l控制第一列的从下数的前两个数(7, 4)。错开来看,规律就出来了:
第1轮-第1次
第1轮-第2次
次数的确定由 r - l 决定,或者 b - t 决定。而具体进行多少轮?只要 b > t && l < r 就继续,否则停止。
11.盛最多水的容器