題目描述
請寫一個程序,找到兩個單鏈表最開始的交叉節點。
- 如果兩個鏈表沒有交叉,返回
null
。 - 在返回結果後,兩個鏈表仍須保持原有的結構。
- 可假定整個鏈表結構中沒有循環。
樣例 1:
輸入:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
輸出:c1
解釋:在節點 c1 開始交叉。
樣例 2:
輸入:
Intersected at 6
1->2->3->4->5->6->7->8->9->10->11->12->13->null
6->7->8->9->10->11->12->13->null
輸出: Intersected at 6
解釋:begin to intersect at node 6.
題解
國內大廠面試除了操作系統和計算機網絡這些基礎外,還需要熟練掌握算法和數據結構。
比起自己刷題,有大神帶着刷肯定更好,專業的算法課程可以隨問隨答,在最短時間內提高算法水平,應對大廠面試。
/**
* This reference program is provided by @jiuzhang.com
* Copyright is reserved. Please indicate the source for forwarding
*/
public class Solution {
/**
* @param headA: the first list
* @param headB: the second list
* @return: a ListNode
*/
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) {
return null;
}
// get the tail of list A.
ListNode node = headA;
while (node.next != null) {
node = node.next;
}
node.next = headB;
ListNode result = listCycleII(headA);
node.next = null;
return result;
}
private ListNode listCycleII(ListNode head) {
ListNode slow = head, fast = head.next;
while (slow != fast) {
if (fast == null || fast.next == null) {
return null;
}
slow = slow.next;
fast = fast.next.next;
}
slow = head;
fast = fast.next;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
}