leetcode代码分类汇总之-链表
来源:互联网 发布:北大青鸟主机报警编程 编辑:程序博客网 时间:2024/06/05 22:54
leetcode上链表的题目还算不少的,暂时收录下面这些,可能有些被我分到其他部分去了。
Add Two Numbers
code:
class Solution {public: ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) { int carry=0; ListNode* dummy = new ListNode(0),*ite=dummy; while(l1&&l2){ int num = l1->val+l2->val+carry; carry = num/10; num %=10; ite->next = new ListNode(num); ite = ite->next; l1 = l1->next; l2 = l2->next; } l1 = l2?l2:l1; while(l1){ int num = l1->val+carry; carry = num/10; num %=10; ite->next = new ListNode(num); ite=ite->next; l1 = l1->next; } if(carry){ ite->next = new ListNode(carry); ite = ite->next; } ite->next = NULL; ite = dummy->next; delete dummy; return ite; }};这个题比较简单,写起来陷阱也不算多,一个改版是,如果链表的数字是倒过来的,怎么做?也就是说链表头是最高位的数字而不是最低位。
可以用递归做。
Partition List
这个是很久之前写的代码,O(n)时间+O(n)空间。应该在代码风格和效率上还有可以优化的地方,暂时放在这里,以后有好的代码再补一个。
code:
class Solution {public: ListNode *partition(ListNode *head, int x) { ListNode* p1 = head; if(head==NULL) return head; vector<int> vec; while(p1!=NULL){ vec.push_back(p1->val); p1 = p1->next; } p1 = head; bool sign = true; int pos = 0; while(p1!=NULL){ while(sign&&pos<vec.size()&&vec[pos]>=x) pos++; while(!sign&&pos<vec.size()&&vec[pos]<x) pos++; if(pos<vec.size()){ p1->val = vec[pos++]; p1 = p1->next; }else{ if(!sign) p1 = p1->next; sign = false; pos = 0; } } return head; }};
关于这个题,还有一个很相似的版本,是要求O(n)时间+O(1)空间做到这个事情,不过给的不是链表,而是数组。我估摸着要是能做到,岂不是可以写出一个稳定的快排??不知道怎么搞。
Remove Duplicates from Sorted List
code:
class Solution {public: ListNode *deleteDuplicates(ListNode *head) { ListNode *ite,*pre=head; if(!head) return head; ite = head->next; while(ite){ if(ite->val==pre->val){ pre->next = ite->next; delete ite; }else pre = ite; ite = pre->next; } return head; }};
一开始没注意是sorted,写了个没有sorted的代码,顺便也附上:
class Solution {public: ListNode *deleteDuplicates(ListNode *head) { ListNode* dummy = new ListNode(1),*ite,*pre=dummy;; dummy->next = head; ite = head; set<int> s; while(ite){ if(s.find(ite->val)!=s.end()){ pre->next = ite->next; delete ite; ite=pre->next; }else{ s.insert(ite->val); pre = ite; ite = ite->next; } } head = dummy->next; delete dummy; return head; }};
Remove Duplicates from Sorted List II
code:
class Solution {public: ListNode *deleteDuplicates(ListNode *head) { ListNode* dummy = new ListNode(1); dummy->next = head; bool sign = false; ListNode* pre = dummy,*ite=head; while(ite){ if(sign||(ite->next&&ite->next->val==ite->val)){ if(!ite->next||ite->next->val!=ite->val) sign =false; else sign = true; pre->next = ite->next; delete ite; }else{ pre=ite; } ite = pre->next; } head = dummy->next; delete dummy; return head; }};
Remove Nth Node From End of List
code:
class Solution {public: ListNode *removeNthFromEnd(ListNode *head, int n) { ListNode** ite = &head, *runner = head,*tmp; while(n--&&runner) runner = runner->next; if(n+1) return head; while(runner) { runner = runner->next; ite = &((*ite)->next); } tmp = *ite; (*ite) = (*ite)->next; delete tmp; return head; }};这个代码的思路就是让一个指针先走n步,那第一个指针到了尾之后,第二个指针就是倒数第n个,然后删掉。
另一个思路是递归,递归结束时记录当前是倒数第几个节点:
class Solution {public: int DelRecursive(ListNode* head,int n){ if(!head) return 0; int k = DelRecursive(head->next,n); if(n==k){ ListNode* tmp = head->next; head->next = head->next->next; delete tmp; } return k+1; } ListNode *removeNthFromEnd(ListNode *head, int n) { ListNode* dummy = new ListNode(0); dummy->next = head; DelRecursive(dummy,n); head = dummy->next; delete dummy; return head; }};Reverse Linked List II
class Solution {public: ListNode *reverseBetween(ListNode *head, int m, int n) { ListNode* dummy = new ListNode(1),*ite = dummy,*tail; dummy->next = head; for(int i=1;i<m;i++) ite=ite->next; head = ite; tail = ite->next; //先断开,再连接,顺序很重要,第m个不用管 for(int i=0;i<n-m;i++){ ite = tail->next; tail->next = ite->next; ite->next = head->next; head->next = ite; } head = dummy->next; delete dummy; return head; }};
记住先断开再连接。Swap Nodes in Pairs
为了体验一下指针的指针跟dummy head的区别,这个题分别用两种方法做了一遍:
2D Pointer code:
class Solution {public: ListNode *swapPairs(ListNode *head) { ListNode** ite = &head; while(*ite&&(*ite)->next) { ListNode* tmp = (*ite)->next; (*ite)->next = tmp->next; tmp->next = *ite; *ite = tmp; ite = &((*ite)->next->next); } return head; }};
dummy head code:class Solution {public: ListNode *swapPairs(ListNode *head) { ListNode* dummy = new ListNode(0),*ite=dummy; dummy->next = head; while(ite->next&&ite->next->next){ ListNode* tmp = ite->next->next;//保存要拿走的节点 ite->next->next = tmp->next; //删除该节点 tmp->next = ite->next; //把该节点接到ite后面 ite->next = tmp; ite = tmp->next; } ite = dummy->next; delete dummy; return ite; }};
- leetcode代码分类汇总之-链表
- leetcode代码分类汇总之-排序
- leetcode代码分类汇总之-查找
- leetcode代码分类汇总之-递归
- leetcode代码分类汇总之-树
- 【南阳OJ分类之大数问题】题目+AC代码汇总
- 经典SQL之分类汇总
- 【南阳OJ分类之语言入门】80题题目+AC代码汇总
- Leetcode分类-链表
- Leetcode分类解析:链表
- LeetCode之Array题目汇总
- LeetCode之Math题目汇总
- LeetCode之String题目汇总
- LeetCode之Backtracing题目汇总
- LeetCode之Stack题目汇总
- LeetCode之Sort题目汇总
- LeetCode之Tree题目汇总
- LeetCode之Graph题目汇总
- ERROR: Unable to create the home directory: Operation not applicable
- 中断处理
- 网站常用幻灯片代码
- 使用".."指定git提交范围与"..."指定git提交范围的区别
- sga手动改自动,以及参数文件管理
- leetcode代码分类汇总之-链表
- 执行进程间切换
- 如何判断可执行程序exe及动态链接库dll是合法的可执行程序,及其是32位还是64位?
- hdu 3485
- [算法导论]动态规划---最长公共最序列问题
- PHP经验集锦
- C语言中的指针数组
- 文件上传功能的实现
- Android中的BroadCastReceiver介绍