上接 链表相关算法题 面试必备(一)
给定一个单链表pHead,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
ListNode* findMiddleNode(ListNode* pHead) { if (pHead == nullptr) return pHead; ListNode* pFast = pHead; ListNode* pSlow = pHead; while (pFast->next != nullptr && pFast->next->next != nullptr) { pFast = pFast->next->next; pSlow = pSlow->next; } if(pFast->next==nullptr) return pSlow; else return pSlow->next; }输入两个链表pHeadA和pHeadB,找出它们的第一个公共节点。
ListNode* getFirstCommonNode(ListNode *pHeadA, ListNode *pHeadB) { if(pHeadA==nullptr || pHeadB==nullptr) return nullptr; int lenA=getListLength(pHeadA); int lenB=getListLength(pHeadB); ListNode* pLong=pHeadA; ListNode* pShort=pHeadB; int len=lenA-lenB; if(len<0){ pLong=pHeadB; pShort=pHeadA; len=-len; } for(int i=0;i<len;i++) pLong=pLong->next; while(pShort!=nullptr && pShort!=pLong){ pShort=pShort->next; pLong=pLong->next; } return pShort; } int getListLength(ListNode* pHead){ if(pHead==nullptr) return 0; ListNode* pNode=pHead; int count=0; while(pNode!=nullptr){ count++; pNode=pNode->next; } return count; }将两个升序链表合并为一个新的升序链表,新链表是通过拼接给定的两个链表的所有节点组成的。
//迭代 ListNode* mergeTwoLists(ListNode* pHead1, ListNode* pHead2) { ListNode* pHair=new ListNode(-1); ListNode* pNode=pHair; while(pHead1!=nullptr && pHead2!=nullptr){ if(pHead1->val<pHead2->val){ pNode->next=pHead1; pHead1=pHead1->next; } else{ pNode->next=pHead2; pHead2=pHead2->next; } pNode=pNode->next; } if(pHead1==nullptr) pNode->next=pHead2; if(pHead2==nullptr) pNode->next=pHead1; return pHair->next; } //递归 ListNode* mergeTwoLists(ListNode* pHead1, ListNode* pHead2) { if(pHead1==nullptr || pHead2==nullptr) return pHead1==nullptr?pHead2:pHead1; if(pHead1->val<pHead2->val){ pHead1->next=mergeTwoLists(pHead1->next, pHead2); return pHead1; } else{ pHead2->next=mergeTwoLists(pHead1, pHead2->next); return pHead2; } }给定一个链表数组,每个链表都已经按升序排列,将所有链表合并到一个升序链表中。
ListNode* mergeKLists(vector<ListNode*>& lists) { if(lists.size()==0) return nullptr; return mergeKLists(lists,0,lists.size()-1); } ListNode* mergeKLists(vector<ListNode*>& lists, int left, int right) { if(left>right) return nullptr; if(left==right) return lists[left]; int mid=left+(right-left)/2; ListNode* mergeLeft=mergeKLists(lists,left,mid); ListNode* mergeRight=mergeKLists(lists,mid+1,right); return mergeTwoList(mergeLeft, mergeRight); }给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。 LeetCode 83 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
ListNode* deleteDuplicates(ListNode* pHead) { if(pHead==nullptr || pHead->next==nullptr) return pHead; ListNode* pHair=new ListNode(-1); pHair->next=pHead; ListNode* pPre=pHair; ListNode* pNode=pHead; while(pNode!=nullptr){ ListNode* pNext=pNode->next; if(pNext!=nullptr && pNext->val==pNode->val){ while(pNext->next!=nullptr && pNext->next->val==pNode->val) pNext=pNext->next; pPre->next=pNext->next; pNode=pNext->next; } else{ pPre=pNode; pNode=pNext; } } return pHair->next; }