力扣160链表是否相交
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
难点在于链表长度不一,无法对应比较
解决这个问题的关键是,通过某些方式,让 p1 和 p2 能够同时到达相交节点 c1。
所以,我们可以让 p1 遍历完链表 A 之后开始遍历链表 B,让 p2 遍历完链表 B 之后开始遍历链表 A,这样相当于「逻辑上」两条链表接在了一起。
a的路程:a+c+b
b的路程:b+c+a
c为重合部分
java
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p1 = headA,p2 = headB;
while(p1 != p2){
if(p1 == null) p1 = headB;
else p1 = p1.next;
if(p2 == null) p2 = headA;
else p2 = p2.next;
}
return p1;
}
}
力扣21 合并两个有序链表
虚拟结点dummy ,比较后加入新链表p.
java
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode dummy = new ListNode(-1);
ListNode p = dummy,p1 = list1,p2 = list2;
while(p1 != null && p2 != null){
if(p1.val <= p2.val){
p.next = p1;
p1 = p1.next;
}else{
p.next = p2;
p2 = p2.next;
}
p = p.next;
}
if(p1 != null){
p.next = p1;
}
if(p2 != null){
p.next = p2;
}
return dummy.next;
}
}
力扣86 分隔链表
给你一个链表的头节点 head 和一个特定值x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
java
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode dummy1 = new ListNode(-1);
ListNode dummy2 = new ListNode(-1);
ListNode p1 = dummy1,p2 = dummy2;
ListNode p = head;
while(p != null){
if(p.val >= x){
p2.next = p;
p2 = p2.next;
}
else{
p1.next = p;
p1 = p1.next;
}
ListNode temp = p.next;
p.next = null;
p = temp;
}
p1.next = dummy2.next;
return dummy1.next;
}
}
力扣141 环形链表,判断给出的链表中是否有环
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
java
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode fast = head , slow = head;
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
if(fast == slow) return true;
}
return false;
}
}
力扣206反转链表
java
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode pre ,cur,nxt;
pre = null;cur = head;nxt = cur.next;
while(cur != null){
cur.next = pre;
pre = cur;
cur = nxt;
if(nxt !=null){
nxt = nxt.next;
}
}
return pre;
}
}
力扣234回文链表
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {//回文链表的判断,使用到反转链表与求链表中点
public boolean isPalindrome(ListNode head) {
ListNode mid = middleNode(head);
ListNode head2 = reverse(mid);
while(head2 != null){
if(head.val != head2.val){
return false;
}
head = head.next;
head2 = head2.next;
}
return true;
}
private ListNode middleNode(ListNode head){//快慢指针常规做法
ListNode slow = head,fast = head;
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
private ListNode reverse(ListNode head){
ListNode pre = null;
ListNode cur = head;
while (cur != null){//
ListNode nxt = cur.next;
cur.next = pre;
pre = cur;
cur = nxt;
}
return pre;
}
}
力扣142 环形链表2
java
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast = head,slow = head;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow ){
break;
}
}
if(fast == null || fast.next == null){
return null;
}
slow = head;
while(slow != fast){
slow =slow.next;
fast = fast.next;
}
return slow;
}
}
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
java
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
return addfc(l1, l2,0);
}
public ListNode addfc(ListNode l1, ListNode l2,int carry){
if(l1 == null && l2 == null && carry == 0){
return null;
}
int s = carry;
if( l1 != null){
s += l1.val;
l1 = l1.next;
}
if(l2 != null){
s += l2.val;
l2 = l2.next;
}
return new ListNode(s % 10, addfc(l1,l2,s / 10));
}
}