1.Two Sum
这题刚开始想用O(N)的方法,但是发现如果用数组标记 [ target-numbers[i] ] 的话,可能会有负数的情况,所以就两个for循环想暴力看看能不能过的,一交发现T了。然后想了下,数组其实可以用map解决,把map当成数组用得了,可以标记负数的情况。java中也有,phthon还没用过。
刚开始想想这个链表没有pre指针,所以想了好久,也没想出个好法子,之前也遇到一个这样的链表没有pre指针的题,原来用的是双指针标记步数,一遍遍历就能得出结果。
算法:
1 准备两个指针first, second
2 先让fisrt走n步
3 让fisrt和second同时走直到first遇到结尾
4 要用一个temp指针来记录second前一个node,用来删除second用。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *removeNthFromEnd(ListNode *head, int n) { ListNode *first=head,*second=head,*tem=head; for(int i=0;i<n;i++) first=first->next; while(first) { tem=second; first=first->next; second=second->next; } if(second==head||second==NULL) head=head->next; else tem->next=second->next; return head; } };
3.Merge Two Sorted Lists
两链表连接起来,连接后的链表还是排序好的,处理好结节就可以了。
class Solution { public: ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) { ListNode *p=NULL,*q=NULL; while(l1&&l2) { if(l1->val<=l2->val) { if(p) { p->next=new ListNode(l1->val); p=p->next; } else p=new ListNode(l1->val),q=p; l1=l1->next; } else if(l1->val>l2->val) { if(p) { p->next=new ListNode(l2->val); p=p->next; } else p=new ListNode(l2->val),q=p; l2=l2->next; } //cout<<"+++"<<endl; } //cout<<"---"<<endl; if(l1) { if(!p) return l1; while(l1) { p->next=new ListNode(l1->val); l1=l1->next; p=p->next; } } else { if(!p) return l2; while(l2) { p->next=new ListNode(l2->val); l2=l2->next; p=p->next; } } return q; } };