21
java
复制代码
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if (list1 == null) return list2;
if (list2 == null) return list1;
ListNode result = new ListNode(0);
ListNode p = result;
while (list1 != null && list2 != null){
if (list1.val < list2.val){
p.next = list1;
list1 = list1.next;
}else {
p.next = list2;
list2 = list2.next;
}
p = p.next;
}
if (list1 != null) p.next = list1;
if (list2 != null) p.next = list2;
return result.next;
}
83
java
复制代码
public ListNode deleteDuplicates(ListNode head) {
if (head == null) return head;
ListNode result = head;
while (result.next != null){
if (result.val == result.next.val){
result.next = result.next.next;
}else {
result = result.next;
}
}
return head;
}
141
java
复制代码
public boolean hasCycle(ListNode head) {
// if (head == null) return false;
// HashMap<ListNode,Integer> linkListMap = new HashMap<ListNode, Integer>();
// while (head.next != null){
// if (linkListMap.get(head) == null){
// linkListMap.put(head,head.val);
// }else return true;
// head = head.next;
// }
// return false;
//-----------------------------------------------
if (head == null) return false;
ListNode fastPtr = head,slowPtr = head;
while (fastPtr.next != null && fastPtr.next.next != null){
fastPtr = fastPtr.next.next;
slowPtr = slowPtr.next;
if (fastPtr == slowPtr) return true;
}
return false;
}
142
java
复制代码
public ListNode detectCycle(ListNode head) {
if (head == null) return null;
boolean test = false;
ListNode fast = head,slow = head;
while (fast.next != null && fast.next.next != null){
fast = fast.next.next;
slow = slow.next;
if (slow == fast) {
test = true;
break;
}
}
if (test){
slow = head;
while (slow != fast){
slow = slow.next;
fast = fast.next;
}
return slow;
}
return null;
}
160
java
复制代码
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
int L1=0,L2=0;
ListNode la = headA,lb = headB;
while (la != null){
L1++;
la = la.next;
}
while (lb != null){
L2++;
lb = lb.next;
}
if ((L1 - L2)>0){
//a比b长
for (int i = 0; i < (L1 - L2); i++) headA = headA.next;
while (headA != headB) {
headA = headA.next;
headB = headB.next;
}
return headA;
}else {
//b比a长或相等
for (int i = 0; i < (L2 - L1); i++) headB = headB.next;
while (headB != headA){
headA = headA.next;
headB = headB.next;
}
return headA;
}
}
206 反转列表
java
复制代码
public ListNode reverseList(ListNode head) {
ListNode currNode = head;
ListNode preNode = null;
while (currNode != null){
ListNode next = currNode.next;
currNode.next = preNode;
preNode = currNode;
currNode = next;
}
return preNode;
}
234回文链表
java
复制代码
public boolean isPalindrome(ListNode head) {
if (head == null) return false;
ListNode fast = head,slow = head;
while (fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
}
if (fast != null){
slow = slow.next;
}
slow = reverse(slow);
fast = head;
while (slow != null){
if (fast.val != slow.val) return false;
fast = fast.next;
slow = slow.next;
}
return true;
}
public ListNode reverse(ListNode head){
ListNode preNode = null;
while (head != null){
ListNode next = head.next;
head.next = preNode;
preNode = head;
head = next;
}
return preNode;
}
876链表的中间节点
java
复制代码
public ListNode middleNode(ListNode head) {
ListNode fast = head,slow = head;
while (fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
}
return slow;//双指针
}