程序员面试金典2.1
1.用Set
class Solution {
public ListNode removeDuplicateNodes(ListNode head) {
if(head==null) return null;
HashSet <Integer>set1=new HashSet<>();
ListNode node1=head;
set1.add(node1.val);
while(node1.next!=null){
ListNode node2=node1.next;
if(!set1.add(node2.val)){
node1.next=node1.next.next;
}
else{
node1=node1.next;
}
}
node1.next=null;
return head;
}
}
2.用二重循环
class Solution {
public ListNode removeDuplicateNodes(ListNode head) {
if(head==null) return null;
ListNode node1=head;
while(node1!=null){
ListNode node2=node1;
while(node2.next!=null){
if(node2.next.val==node1.val) node2.next=node2.next.next;
else node2=node2.next;
}
node1=node1.next;
}
return head;
}
}
一个是关于忘记最后的node1=node1.next导致超时
一个是关于node1!=null还是node1.next!=null的争论
好像判断准则是不能出现null.next
2.2倒数第k个值
class Solution {
public int kthToLast(ListNode head, int k) {
ListNode node1=head;
ListNode node2=head;
for(int i=0;i<k-1;i++) node2=node2.next;
while(node2.next!=null){
node2=node2.next;
node1=node1.next;
}
return node1.val;
}
}
经典双指针,不赘述。数据结构课的练习题
2.3删除中间节点
class Solution {
public void deleteNode(ListNode node) {
node.val=node.next.val;
node.next=node.next.next;
}
}
数据结构课上练习,再次见还愣了一下,不再赘述
2.4分割链表
我想用双指针去做,但是写的判断为null的条件太多了,原代码如下:
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode node1=head;
while(node1!=null){
while(node1.val<x){
node1=node1.next;
if(node1==null) break;
}
if(node1==null) break;
ListNode node2=node1.next;
if(node2==null)break;
while(node2.val>=x){
node2=node2.next;
if(node2==null) break;
}
if(node2==null)break;
int temp=node1.val;
node1.val=node2.val;
node2.val=temp;
}
return head;
}
}
2.5链表求和(*)
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int carry=0; //进位
ListNode head=new ListNode(-1);//虚拟头结点,便于答案返回
ListNode node1=head;
while(l1!=null || l2!=null ||carry!=0){
int sum=carry;
if(l1!=null){
sum+=l1.val;
l1=l1.next;
}
if(l2!=null){
sum+=l2.val;
l2=l2.next;
}
node1.next=new ListNode(sum%10);
node1=node1.next;
carry=sum/10;
}
return head.next;
}
}
就是一位一位的进行处理,注意进位符号carry的处理。
sum=l1.val+l2.val+carry
l1和l2要注意是否为空
node1.next=new ListNode(sum%10);从确立新节点的时候,用node1.next;