面试题 02.07. 链表相交
/**
* Definition for singly-linked list.
* public class ListNode {
* int val
* ListNode next
* ListNode(int x) {
* val = x
* next = null
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode curA = headA
ListNode curB = headB
int lenA = 0, lenB = 0
while(curA != null){
lenA ++
curA = curA.next
}
while(curB != null){
lenB ++
curB = curB.next
}
curA = headA
curB = headB
//让curA为最长链表的头,lenA为其长度
if(lenB > lenA){
//1. 交换lenA lenB
int tmpLen = lenA
lenA = lenB
lenB = tmpLen
//2. 交换curA curB
ListNode tmpNode = curA
curA = curB
curB = tmpNode
}
int gap = lenA - lenB
while(gap-- > 0){
curA = curA.next
}
while(curA != null){
if(curA == curB){
return curA
}
curA = curA.next
curB = curB.next
}
return null
}
}
19. 删除链表的倒数第 N 个结点
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyNode = new ListNode(0)
dummyNode.next = head
ListNode fastIndex = dummyNode
ListNode slowIndex = dummyNode
for(int i = 0
fastIndex = fastIndex.next
}
while(fastIndex.next != null){
fastIndex = fastIndex.next
slowIndex = slowIndex.next
}
slowIndex.next = slowIndex.next.next
return dummyNode.next
}
}
24. 两两交换链表中的节点
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null) return head
ListNode next = head.next
ListNode newNode = swapPairs(next.next)
next.next = head
head.next = newNode
return next
}
}
142. 环形链表 II
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode slow = head
ListNode fast = head
while(fast != null && fast.next != null){
slow = slow.next
fast = fast.next.next
if(slow == fast){
ListNode index1 = fast
ListNode index2 = head
while(index1 != index2){
index1 = index1.next
index2 = index2.next
}
return index1
}
}
return null
}
}