LeetCode 24.两两交换链表中的节点
答案
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) return head;
ListNode headNext = head.next;
ListNode newNode = swapPairs(headNext.next);
headNext.next = head;
head.next = newNode;
return headNext;
}
LeetCode 19.删除链表的倒数第N个节点
答案
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyhead = new ListNode(-1, head);
ListNode fastNode = dummyhead;
ListNode slowNode = dummyhead;
for (int i = 0; i < n; i++){
fastNode = fastNode.next;
}
while (fastNode.next != null){
fastNode = fastNode.next;
slowNode = slowNode.next;
}
slowNode.next = slowNode.next.next;
return dummyhead.next;
}
面试题 02.07. 链表相交
答案
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;
if (lenB > lenA){
int tempLen = lenA;
lenA = lenB;
lenB = tempLen;
ListNode tempNode = curA;
curA = curB;
curB = tempNode;
}
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;
}
LeetCode 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;
}
}