链表的两数相加,没用什么高端的算法,就是计算每个端点的和,如果不大于10就直接加上去,不然就进1再加,加到后面一个链表没了就当做是0,两个链表都没了还是要看是否向前进了1,想法不难,但写法很巧妙,可以多看看理解
/**
* 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 ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode root=new ListNode();
ListNode p=root;
int add=0;
while(l1!=null||l2!=null||add!=0){
int a=l1==null?0:l1.val;
int b=l2==null?0:l2.val;
int sum=a+b+add;
add=sum/10;
p.next=new ListNode(sum%10);
p=p.next;
l1=l1==null?l1:l1.next;
l2=l2==null?l2:l2.next;
}
return root.next;
}
}
该题想法也很简单,就是一个指针保存奇数的链表,一个保存偶数的,最后把偶数的接在奇数后面就行,但是实现起来也要注意细节
class Solution {
public ListNode oddEvenList(ListNode head) {
if(head==null||head.next==null) return head;
ListNode even=new ListNode();
even.next=head.next;
ListNode root=head;
ListNode p=even;
while(head!=null&&p!=null){
if(head.next==null) break;
p.next=head.next;
p=p.next;
if(p.next==null) break;
head.next=p.next;
head=head.next;
}
p.next=null;
head.next=even.next;
return root;
}
}
三种想法,最简单的就是用set先保存a的节点,在遍历b的节点,已经存在了就可以返回了
第二种就是计算长度,长的先走到和短的同一个位置,再一起走,走到相同位置返回
第三种双指针,指针a从a开始走,指针b从b开始走,如果走完了a从b再走,b从a再走,就这样循环,要么在相同节点相遇,要么在末尾相遇
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
int lenA=0;
int lenB=0;
ListNode pa=headA;
ListNode pb=headB;
while(pa!=null){
lenA++;
pa=pa.next;
}
while(pb!=null){
lenB++;
pb=pb.next;
}
int diff=lenA-lenB;
if(diff>0){
for(int i=0;i<diff;i++){
headA=headA.next;
}
}
if(diff<0){
while(diff<0){
headB=headB.next;
diff++;
}
}
while(headA!=null){
if(headA==headB) return headA;
headA=headA.next;
headB=headB.next;
}
return null;
}
}